5

AnTLR4 で Python 文法を実装していますが、ここで説明されている INDENT と DEDENT で同じ問題に直面しています: ANTLR4- 動的にトークンを挿入する

私が試みている解決策は、ここで見つけることができる Ter による解決策を変換することですhttp://antlr3.org/grammar/1078018002577/python.tar.gz (nextToken をオーバーライドし、架空のトークンを挿入します)。

問題は、このソリューションでは、次のようなレクサー ルールがあることを前提としていることです。

LEADING_WS
    :   {getColumn()==1}?
        // match spaces or tabs, tracking indentation count
        (   ' '  { spaces++; }
        |   '\t' { spaces += 8; spaces -= (spaces % 8); }
        |   '\014' // formfeed is ok
        )+
        {
        }
        ...

しかし、レクサールールのアクションは単一の代替案の最後の要素でなければならないため、エラーが発生し続けます。

誰かが解決策を見つけるのを手伝ってくれますか?

どうもありがとう!!!

4

1 に答える 1

3

関連する計算をルールspacesの最後または の実装に移動する必要があります。最終的には次のようになります。LEADING_WSnextTokenLEADING_WS

LEADING_WS
  : {getColumn()==1}?
    // match spaces or tabs, tracking indentation count
    [ \t]+
    {spaces = computeSpaces(_input.getText());}
    ;
于 2013-08-23T18:56:53.673 に答える