1

次の文法のindent_loop[3]を3つのインデントのグループ置き換えることはできますか?ここで、INDENTはインデントの字句規則です。

数に基づいてインデントの数を書きたいだけです。

match_node
        :   match_node_name (tree_operator) (NEW_LINE (indent_loop[3]) ( moduleCall | literals ))*
            { match_node_list.push($match_node_name.text); }
        |   SINGLE_QUOTE POINTE SINGLE_QUOTE 
        ;


    match_node_name
        :   IDENT_SMALL_LETTERS
        ;

    indent_loop[int scope]
        :   {scope == 3}? INDENT INDENT INDENT  
        |   {scope == 4}? INDENT INDENT INDENT INDENT   
        ;

    INDENT :  '\t';

これを行ったとき、呼び出しルールに戻ることができず、このインデントのグループを返すことができませんでしたか?つまり、(moduleCall |リテラル))*は呼び出されませんでした。

私はどこが間違っていますか?まだ始まったばかりです。

または、これを行う他の方法はありますか?

4

1 に答える 1

1

セマンティック述語1を使用してそれを行うことができます。

grammar T;

parse
 : digit[1] digit[2] digit[3] EOF
 ;

digit[int amount]
 : ({amount > 0}?=> DIGIT {amount--;})*
 ;

DIGIT
 : '0'..'9'
 ;

上記の文法から生成されたパーサーで解析"456789"すると、次の解析が行われます。

ここに画像の説明を入力

あなたの場合、必ずしもインデントではなく、単にタブに一致していることに注意してください(つまり、行の先頭から1つ以上のタブ)。行の先頭からのみインデントを一致させたい場合、(IMHO)最も簡単な方法は、レクサー2でそれらを処理することです。


1 ANTLR の「セマンティック述語」とは何ですか?
2 ANTLR インデント依存文法のような Python を実現する最も簡単な方法は何ですか?

于 2012-06-05T07:59:12.577 に答える