2

私はANTLRの初心者であり、既存の(そして複雑な)文法を変更する必要があります。

他のルールと解析せずにブロックを保持するルールを作成したいと思います。より明確にするために、c++で記述されたコードをインタープリターされたコードに挿入する必要があります。


2013年11月2日編集

多くのテストの後、これが私の文法、私のテスト、私が持っている結果、そして結果と欲しいものです:

文法

cppLiteral
    : cppBegin cppInnerTerm cppEnd
    ;
cppBegin
    :  '//$CPP_IN$'
    ;
cppEnd
    : '//$CPP_OUT$'
    ;
cppInnerTerm
    : ( ~('//$CPP_OUT$') )*
    ;

テスト

//$CPP_IN$
txt1 txt2
//$CPP_OUT$

結果

cppLiteral ->
cppBegin = '//$CPP_IN$'
cppInnerTerm = 'txt1' 'txt2'
cppEnd = '//$CPP_OUT$'

期待される結果

cppLiteral ->
cppBegin = '//$CPP_IN$'
cppInnerTerm = 'txt1 txt2'
cppEnd = '//$CPP_OUT$'

(申し訳ありませんが、10件の評判がないため、ASTの画像を投稿できません)

次のように、3つのトークン「cppBegin」、「cppInnerTerm」、および「cppEnd」を1つのトークンに含めることができます。

cppLiteral
    : '//$CPP_IN$'( ~('//$CPP_OUT$') )*'//$CPP_OUT$'
    ;

この結果を得るには:

cppLiteral = '//$CPP_IN$\n txt1 txt2\n //$CPP_OUT$'
4

1 に答える 1

0

他のルールと解析せずにブロックを保持するルールを作成したいと思います。

複数行コメントのように解析し/* foobar */ます。例:以下は、質問で指定されたキーワードを使用した小さな例です。

ほとんどの作業はレクサールール(大文字で始まるルール)で行われることに注意してください。テキストのブロックを処理する場合、特にこの場合のように他のルールを避けたい場合は、パーサールールではなくレクサールールの観点から考えている可能性があります。

CppBlock.g

grammar CppBlock;

document: CPP_LITERAL* EOF;


fragment CPP_IN:'//$CPP_IN$';
fragment CPP_OUT:'//$CPP_OUT$';
 
CPP_LITERAL:  CPP_IN .* CPP_OUT
            {
                String t = getText(); 
                t = t.substring(10, t.length() - 11); //10 = length of CPP_IN, 11 = length of CPP_OUT
                setText(t);
            }
            ;
WS: (' '|'\t'|'\f'|'\r'|'\n')+ {skip();};

簡単なテストケースは次のとおりです。

入力

//$CPP_IN$
static const int x = 0; //magic number
int *y; //$CPP_IN$ <-- junk comment
static void foo(); //forward decl...
//$CPP_OUT$

//$CPP_IN$
//Here is another block of CPP code...
const char* msg = ":D";
//The end.
//$CPP_OUT$

出力トークン

[CPP_LITERAL : 
static const int x = 0; //magic number
int *y; //$CPP_IN$ <-- junk comment
static void foo(); //forward decl...
]
[CPP_LITERAL : 
//Here is another block of CPP code...
const char* msg = ":D";
//The end.
] 

ルールCPP_LITERALは、入力の最初と最後(後//$CPP_IN$と前//$CPP_OUT$)に改行を保持します。それらが不要な場合は、アクションを更新してそれらを削除してください。そうでなければ、この文法はあなたが求めていることをしていると思います。

于 2013-02-12T04:14:41.320 に答える