2013-08-23 11 views
5

私はAnTLR4でPythonの文法を実装していますが、私はINDENTとDEDENTと同じ問題に直面していますが、ここで説明:ANTLR4- dynamically inject tokenAnTLR4:INDENTとDEDENTトークン

を私がしようとしているソリューションをすることができテルにより溶液を変換することですここに見つかりました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 
     )+ 
     { 
     } 
     ... 

が、私はレクサールールのアクションは、単一altermost代替の最後の要素でなければならないので、エラーを取得しておいてください。

問題は、このソリューションは、私たちのような字句解析ルールを持っていることを前提としていることです。

誰でも解決策を見つけるのを手助けできますか?

ありがとうございました!!!

+1

が、私は同じ問題を持っていたし、それのためのヘルパークラスを作成することにしました:[ANTLR-denter](https://github.com/yshavit/antlr-denter)。 – yshavit

答えて

3

spacesを含む計算をLEADING_WSルールの末尾またはnextTokenの実装に移動する必要があります。 LEADING_WSの終わりには、次のようになります。恥知らずなプラグインのため申し訳ありません

LEADING_WS 
    : {getColumn()==1}? 
    // match spaces or tabs, tracking indentation count 
    [ \t]+ 
    {spaces = computeSpaces(_input.getText());} 
    ; 
+0

ご返信ありがとうございます。私はnextTokenのオーバーライドされた実装にそれを置く解決策を試みています! – pinker

+0

好奇心のために、あなたが提案したソリューションをテストしましたが、私は$ textがレクサーのアクションで許可されていないことを知りました!私はそれを正しく使用していますか? – pinker

+0

@pinker申し訳ありませんが、ANTLR 4では '$ text'ではなく' _input.getText() 'を使用する必要があります。 –

関連する問題