说我的解析器规则是这样的:
rule1 : 'functionA' '(' expression-inside-parenthesis ')';
expression-inside-parenthesis: ....;
但我从未为'functionA','('和')'定义任何词法分析器规则。解析器会将这些标记视为令牌吗?对于'('和')',无论如何只有1个字符,我想没有区别。但对于'functionA',如果我从未在我的词法分析器规则中将其定义为令牌,那么解析器怎么能将其视为令牌呢?
答案 0 :(得分:1)
JavaMan写道:
解析器如何将其视为令牌?
ANTLR在幕后为你创建一个令牌。
规则:
rule1 : 'functionA' '(' expression-inside-parenthesis ')';
// parser rules ...
// lexer rules ...
相当于:
rule1 : FA '(' expression-inside-parenthesis ')';
// parser rules ...
FA : 'functionA';
// lexer rules ...
如果令牌只包含1个字符且不在其他令牌中出现,例如'('
和')'
,则可以在解析器规则中“动态”定义它们,一旦你的词法分析器语法也包含类似标识符的标记,最好在词法分析器语法中自己显式定义像'functionA'
这样的标记。通过明确地自己定义它们,词法分析器尝试将输入标记为什么顺序就更清楚了。
如果您使用了文字标记并定义了匹配相同的词法规则,请执行以下操作:
parse : 'functionA' ID;
FA : 'functionA';
ID : 'a'..'z'+;
然后ANTLR将parse
规则解释为:
parse : FA ID;