次の形式のスクリプト言語があります。
<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 ファイルを使用します。最初の行にはトークンとして command
andがあります。さらに解析する必要があるため、ターゲット言語ではなく、ANTLR がすべての作業を行うとよいでしょう。goto->step_b
goto->step_b
これを直接行う方法がない場合は、2 つの段階でこれを達成すると考えました。
- 上記の *.g ファイルを使用して入力ファイルを解析します
- ノード以外のすべて
command
をカリングします。および構文のみcommand_b
に定義された文法を使用して、これらのノードを別のパーサーにフィードします。command
command_b
command
/command_b
ルールを他のルールとは異なる方法で処理できるように、単一の文法を使用してスクリプトを解析する方法はありますか? または、スクリプト ファイルを複数の段階で処理する必要がありますか?
助けてくれてありがとう。
ジョシュ