2017-06-13 4 views
1

私はANTLRを新しくしました。私はちょうどそうのような生産の各選択肢にラベルを付けることが可能であることを発見:なぜ、ANTLRはラベル付けされたすべての、または選択肢がないことを要求しますか?

foo 
    : a # aLabel 
    | b # bLabel 
    | // ... 
    ; 

しかし、私はそれが不快全か無の選択肢がラベル付けされなければならないことがわかります。私は最近、20以上のブランチを持つプロダクションの2つの選択肢にラベルを付ける必要がありましたが、他のラベルにはそれぞれ# stubLabelというラベルが付いてしまいました。すべてまたは何もラベルを付ける必要がない何らかの理由はありますか?

答えて

3

になります。これを混在させることはできません(たとえば、ルール全体のコンテキストと、一部のaltsのコンテキストのみを含む)。ラベルを使用し始めてルールコンテキストが生成されなくなると、すべてのaltsのコンテキストを生成する必要があります。

1

OK、私はこれを理解したと思います。恐らくスペースを節約するために、各ラベルに対応するノードは、それの子ではなく、生産に対応するノードからサブクラス化される。あなたはANTLR4は、もはや各ALTのためにそのルールのコンテキストクラスではなく、個々のコンテキストクラスを生成しませんラベルを追加すると

expression 
    : // ... 
    | foo # namedMethodInvocation 
    ; 

はできるだけ早く

関連する問題