为什么ANTLR解析跳过令牌?

时间:2010-07-21 14:43:42

标签: parsing antlr lexer

我正在尝试做一些非常基本的C ++函数声明解析。这是解析输入参数的规则:

arg : 'const'? 'unsigned'? t=STRING m=TYPEMOD? n=STRING 
 -> ^(ARG $n $t $m?) ;

STRING  : ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'::')+ ;

TYPEMOD 
 : ('*' | '&')+ ;

问题是我试图通过它:

int *param

它将“int”与t匹配,但随后跳过TYPEMOD,抛出一个异常,说明在尝试匹配n时不需要*,然后将“param”与n匹配。为什么它会跳过TYPEMOD令牌并且不匹配呢?

提前致谢!

编辑:

这是我的空白规则(我也包含了我的评论规则),在解析其他类似的声明,属性,结构等内容时,一切似乎都能正常工作,这只是这些TYPEMOD的东西......

COMMENT_LINE 
    :   '//' (~'\n')* '\n' { $channel = HIDDEN; } ;

COMMENT_BLOCK 
    :   '/*' .* '*/' { $channel = HIDDEN; } ;

NL      :   ('\r' | '\n')+ { $channel = HIDDEN; } ;

WS      :   (' '|'\t')+ { $channel = HIDDEN; } ;

1 个答案:

答案 0 :(得分:1)

只需稍作修改,我认为这就是您希望规则继续工作的目的:

 arg : 'const'? 'unsigned'? t=STRING m=typemod? n=STRING 
 -> ^(ARG $n $t $m?) ;

typemod : TYPEMOD+;

STRING  : ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'::')+ ;

TYPEMOD 
 : '*'|'&' ;

STRING词法分析器规则我没有改变,但我确实修改了你的arg和TYPEMOD规则并创建了一个新的解析器规则typemod。

哦,是的,我使用了java目标,所以希望这对你有用。

希望这会有所帮助,祝你好运。