我正在尝试编写一个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规则工作正常(例如它),但两个注释规则似乎没有任何效果。 (即评论不被忽略)。
我错过了什么?
答案 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匹配。