1

我正在尝试做一些非常基本的 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; } ;
4

1 回答 1

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 目标,所以希望这对你有用。

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

于 2010-07-21T23:31:43.677 回答