无法使ANTLR4语法跳过评论

时间:2014-05-01 14:29:19

标签: comments antlr4 lexer

我正在尝试编写一个ANTLR4语法来解析actionscript3。我决定从相当粗糙的东西开始:

grammar actionscriptGrammar;

OBRACE:'{';
CBRACE:'}';
STRING_DELIM:'"';

BLOCK_COMMENT : '/*' .*? '*/' -> skip;
EOL_COMMENT : '//' .*? '/n' -> skip;
WS: [ \n\t\r]+ -> skip;

TEXT: ~[{} \n\t\r"]+;

thing
    : TEXT
    | string_literal
    | OBRACE thing+? CBRACE;

string_literal : STRING_DELIM .+? STRING_DELIM;

start_rule
    : thing+?;

基本上,我想要一个按其词法范围分组的事物树。我希望忽略注释,并且字符串文字是他们自己的东西,这样他们可能包含的任何大括号都不会影响词​​法范围。 string_literal规则工作正常(例如它),但两个注释规则似乎没有任何效果。 (即评论不被忽略)。

我错过了什么?

2 个答案:

答案 0 :(得分:6)

这是我在ANTLR v4中编写的简化Java语法。

WS
    : [ \t\r\n]+ -> channel(HIDDEN)
;

COMMENT
    : '/*' .*? '*/' -> skip
;

LINE_COMMENT
    : '//' ~[\r\n]* -> skip
;

可能这可以帮到你。

另外,请尝试重新排列代码。首先编写解析器规则,然后编写Lexer规则。遵循自上而下的方法。我发现它在调试方面更有帮助。当您从ANTLR 4 Eclipse插件创建语法的HTML导出时,它也会很好看。

祝你好运!

答案 1 :(得分:3)

答案是您的TEXT规则正在消耗您的评论。而不是使用否定集,使用类似:

TEXT: [a-zA-Z0-9_][/a-zA-Z0-9.;()\[\]_-]+ ;

这样,您的评论就无法与TEXT匹配。