几个词法分析器规则可以匹配相同的输入文本。在这种情况下,令牌类型将选择如下:
首先,选择与最长输入匹配的词法分析器规则
如果文本与隐式定义的标记匹配(例如'{'),请使用隐式规则
如果多个词法分析器规则匹配相同的输入长度,请根据定义顺序选择第一个
以下是组合语法:
grammar LexerPriorityRulesExample; // 解析器规则 randomParserRule: 'foo'; // 隐式声明的令牌类型 // Lexer规则 BAR: 'bar'; IDENTIFIER: [A-Za-z]+; BAZ: 'baz'; WS: [ \t\r\n]+ -> skip;
给出以下输入:
aaa foo bar baz barz
将从词法分析器生成以下令牌序列:
IDENTIFIER 'foo' BAR IDENTIFIER IDENTIFIER
aaa 是类型 IDENTIFIER
只有IDENTIFIER规则可以匹配此令牌,没有歧义。
foo 是类型 'foo'
解析器规则randomParserRule引入了隐式'foo'令牌类型,该类型比IDENTIFIER规则优先。
bar 是类型 BAR
该文本与在BAR规则之前定义的IDENTIFIER规则匹配,因此具有优先权。
baz 是类型 IDENTIFIER
该文本与BAZ规则匹配,但也与IDENTIFIER规则匹配。后者是按之前 定义的那样选择的BAR。
给定语法,BAZ它将永远无法匹配,因为该IDENTIFIER规则已经涵盖了所有BAZ可以匹配的内容。
barz 是类型 IDENTIFIER
该BAR规则可以匹配此字符串(bar)的前3个字符,但是该IDENTIFIER规则将匹配4个字符。当IDENTIFIER匹配更长的子字符串时,将选择BAR。
根据经验,应在更通用的规则之前定义特定的规则。如果规则只能匹配先前定义的规则已覆盖的输入,则将永远不会使用该规则。
隐式定义的规则(例如)的'foo'行为就像在所有其他词法分析器规则之前定义的一样。
我有一个巨大的ANTLR语法,我面临着一个小问题。语法有两个规则expr和set,定义如下: 这里的问题是,对于一组形式*s1*s2,应该减少如下: 然后RHS中的每一组应减少到: 但相反,它们正在减少: 因为forn的集合被解析为,而不是。 set的规则之一,将其简化为exr。语法中还有许多其他类似的规则也简化为exr。这里出现的问题是因为set和exr中的一些规则是相似的。但是因为有些规则不同
本文向大家介绍ANTLR 简单规则,包括了ANTLR 简单规则的使用技巧和注意事项,需要的朋友参考一下 示例 Lexer规则定义令牌类型。它们的名称必须以大写字母开头,以区别于解析器规则。 基本语法: 语法 含义 A 匹配名称为lexer的规则或片段 A A B 比赛A之后B (A|B) 匹配A或B 'text' 匹配文字“文本” A? 匹配A零或一次 A* 匹配A零次或多次 A+ 匹配A一次或多
我有以下案文: 在第一步中,下面的映射是tacking place: JAPE规则: 我不明白为什么-rule是匹配的,而不是。
这是我的语法文件: https://github.com/frankdu/minijs/blob/master/antlr/src/main/resources/org/minijs/parser/antlr/javascript.g4 问题在于语句解析。当它看到break语句时 https://github.com/frankdu/minijs/blob/master/core/src/test
本文向大家介绍ANTLR 隐式词法规则,包括了ANTLR 隐式词法规则的使用技巧和注意事项,需要的朋友参考一下 示例 当'{'在解析器规则中使用like标记时,将为它们创建隐式词法分析器规则,除非存在显式规则。 换句话说,如果您有词法分析器规则: 然后,这两个解析器规则都是等效的: 但是,如果OPEN_BRACE是词法规则没有定义,一个隐含的匿名规则将被创建。在这种情况下,隐含的规则将被定义为,如
我是ANTLR4的新手,我试图解析此输入 在这个输入中,A应该是一个函数调用,而B应该是一个名为B的变量。但我在lexer中有一个跳过空格的规则。 如何为此输入编写解析器规则,但保留跳过空格的规则 提前感谢