使用字符串文字的ANTLR分析器规则

时间:2011-09-22 11:22:03

标签: parsing antlr lexer

说我的解析器规则是这样的:

rule1 : 'functionA' '(' expression-inside-parenthesis ')'; 
expression-inside-parenthesis: ....;

但我从未为'functionA','('和')'定义任何词法分析器规则。解析器会将这些标记视为令牌吗?对于'('和')',无论如何只有1个字符,我想没有区别。但对于'functionA',如果我从未在我的词法分析器规则中将其定义为令牌,那么解析器怎么能将其视为令牌呢?

1 个答案:

答案 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;