2013-02-11 80 views
1

我有以下形式的脚本语言: <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", 

我希望能够以不同的方式处理commandcommand_bdisplay规则使用ANTLR不使用目标语言协助解析一切。使用上面的* .g文件;第一行有commandgoto->step_b作为标记。需要进一步解析goto->step_b,那么让ANTLR完成所有这些工作而不是目标语言会很好。

如果没有办法直接做到这一点,我想我会在两个阶段完成这一点。上述

  1. 使用* .G文件来分析输入文件
  2. 卡尔的一切,但commandcommand_b节点;仅使用为commandcommand_b语法定义的语法将这些节点馈送到另一解析器。

有没有办法使用单一的语法,这样我可以处理command/command_b规则不同于任何其他规则解析脚本?或者我将不得不在多个阶段处理脚本文件?

感谢您的任何帮助。

乔希

回答

1

看一看我的答案在这里:

antlr identifier name same as pre-defined function name cause MismatchedTokenException

可以使用非模糊语义断言,以保持这些规则出你的语法:

COMMAND : 'command' ; 
COMMAND_B : 'command_b' ; 
DISPLAY : 'display' ; 

,而是你会写规则,如:

functions_stats 
    : {input.LT(1).getText().equals("command")}? '=' /* parser rules for command */ ',' ; 
    ; 

语义谓词中的动作是语言特定的,因此可能因您的目标语言而异。它适用于Java,也可能适用于其他许多应用程序。