我有以下形式的脚本语言: <keyword> = <text>,
ANTLR v3的解析领域特定语言
哪里<text>
可以包含关键字有时<text>
可以包含指令取决于什么<keyword>
使用。
我想根据<keyword>
的使用情况来处理<text>
。
/* lang.g */
grammar lang;
/* parser rules */
script : assignment+ ;
assignment : keyword VALUE ;
/* cannot do the following (but I would like to)
assignment : command | command_b | display ;
command : COMMAND '=' /* parser rules for command */ ',' ;
command_b : COMMAND_B '=' /* parser rules for command_b */ ',' ;
display : DISPLAY '=' ~(',')+ ',' ;
*/
/* lexer rules */
VALUE : '='! ~(',')+ ','!
COMMAND : 'command' ;
COMMAND_B : 'command_b' ;
DISPLAY : 'display' ;
WS : (' '|'\t'|'\r'|'\n')+ {$channel=HIDDEN;} ;
例输入文件:
command = goto->step_b,
display = this is some plain text. command keyword used,
command_b = read_file:"readme.txt",
我希望能够以不同的方式处理command
,command_b
和display
规则使用ANTLR不使用目标语言协助解析一切。使用上面的* .g文件;第一行有command
和goto->step_b
作为标记。需要进一步解析goto->step_b
,那么让ANTLR完成所有这些工作而不是目标语言会很好。
如果没有办法直接做到这一点,我想我会在两个阶段完成这一点。上述
- 使用* .G文件来分析输入文件
- 卡尔的一切,但
command
和command_b
节点;仅使用为command
和command_b
语法定义的语法将这些节点馈送到另一解析器。
有没有办法使用单一的语法,这样我可以处理command
/command_b
规则不同于任何其他规则解析脚本?或者我将不得不在多个阶段处理脚本文件?
感谢您的任何帮助。
乔希