1

次の形式のスクリプト言語があります。 <keyword> = <text>,

where<text>にはキーワードを含めることが<text>でき、使用する内容に応じて指示を含めることができます<keyword>

<text>使用されるものに基づいて処理しようとして<keyword>います。

/* 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",

ターゲット言語を使用せずに、ANTLR を使用してすべてを解析することcommandで、command_bとルールを異なる方法で処理できるようにしたいと考えています。display上記の *.g ファイルを使用します。最初の行にはトークンとして commandandがあります。さらに解析する必要があるため、ターゲット言語ではなく、ANTLR がすべての作業を行うとよいでしょう。goto->step_bgoto->step_b

これを直接行う方法がない場合は、2 つの段階でこれを達成すると考えました。

  1. 上記の *.g ファイルを使用して入力ファイルを解析します
  2. ノード以外のすべてcommandをカリングします。および構文のみcommand_bに定義された文法を使用して、これらのノードを別のパーサーにフィードします。commandcommand_b

command/command_bルールを他のルールとは異なる方法で処理できるように、単一の文法を使用してスクリプトを解析する方法はありますか? または、スクリプト ファイルを複数の段階で処理する必要がありますか?

助けてくれてありがとう。

ジョシュ

4

1 に答える 1

1

ここで私の答えを見てください:

事前定義された関数名と同じ antlr 識別子名により、MismatchedTokenException が発生します

これらのルールを文法から除外するために、あいまいさを解消するセマンティック述語を使用できます。

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

代わりに、次のようなルールを記述します。

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

セマンティック述語のアクションは言語固有であるため、ターゲット言語によって異なる場合があります。これは Java で動作し、おそらく他の多くのアプリケーションでも動作します。

于 2013-02-22T21:18:20.583 に答える