【问题标题】:Using a word as a language keyword and Identifier in the same ANTLR4 grammar? [duplicate]在同一个 ANTLR4 语法中使用一个词作为语言关键字和标识符? [复制]
【发布时间】:2018-06-22 10:54:53
【问题描述】:

关于以下简化语法

proof_command : 'Proof' 'using' collection '.';
collection : 'Collection' IDENT ':=' section_subset_expr
           | 'Collection' KeySOME ':=' IDENT IDENT IDENT
           ;

KeySOME : 'Some';

(而 IDENT 只是 Java 中的常用标识符)我正在尝试解析以下内容:Proof using Collection Some := a b c . 这不起作用并导致以下错误消息:

不匹配的输入“a”需要“section_subset_expr”

这是因为 IDENT 当然也可以是“一些”。

有没有办法使用 Some 作为关键字和标识符,所以上面的表达式被正确解析?也许通过在集合规则中从 IDENT 中排除“Some”的语义谓词?但那会是什么样子呢?

IDENT : IDENT2;
fragment IDENT2 : FIRST_LETTER (SUBSEQUENT_LETTER)*;
fragment FIRST_LETTER :  [a-z] | [A-Z] | '_' | UNICODE_LETTER;
fragment SUBSEQUENT_LETTER : [a-z] | [A-Z] | DIGIT | '_' | '"' | '\''| UNICODE_LETTER | UNICODE_ID_PART;
fragment UNICODE_LETTER : '\\' 'u' HEX HEX HEX HEX;
fragment UNICODE_ID_PART : '\\' 'u' HEX HEX HEX HEX;
fragment HEX : [0-9a-fA-F];

KeySOME : 'Some'; 

【问题讨论】:

  • 相对于KeySOME 的定义,您在语法中的哪个位置定义IDENT
  • 我在 IDENT 后面定义了它。我不知道这会有所作为。是吗?

标签: antlr4 keyword identifier ambiguity mismatch


【解决方案1】:

词法分析器的工作方式是,当可以在给定输入上匹配多个规则时,它会根据以下标准决定使用哪一个:

  1. 如果一个规则导致比所有其他规则更长的匹配,则采用该规则(这称为最大多规则)
  2. 如果多个规则导致相同长度的匹配,则采用语法中第一个出现的规则。直接出现在解析器规则中的文字(例如语法中的“证明”、“使用”和“集合”)被视为出现在任何命名的词法分析器规则之前。

因此,由于您的 KeySOME 规则出现在 IDENT 后面,因此它永远不会被采用,因为任何匹配 KeySOME 的输入也匹配 IDENTIDENT

因此,您可以将 KeySOME 移动到 IDENT 之前出现,或者您可以完全删除规则并直接使用 'Some' 代替它(即'Collection' 'Some' ':=' IDENT IDENT IDENT)。

【讨论】:

  • 这让我更进一步。但现在我不能再使用 Some 作为标识符了。这里不会解析:“Collection Some := Some Some Some”。有没有办法解决这个问题?为了清楚起见,该语言允许 Some 作为关键字和标识符。
  • @TilmanZuckmantel 根据词法分析器规则,每个标记都只有一种标记类型。 Some 始终是关键字或始终是 IDENT。如果您想在某些地方允许Some 代替IDENT,则必须在这些情况下显式添加它作为替代。也许通过规则idOrSome : IDENT | 'Some';
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2020-01-09
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 2016-11-25
相关资源
最近更新 更多