我正在尝试做一些非常基本的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; } ;
答案 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目标,所以希望这对你有用。
希望这会有所帮助,祝你好运。