14

antlr4をアップグレードしようとすると、文法に2行あり、エラーメッセージが表示されます。

セットではないブロックに割り当てられたラベルtok

特に次のような文法行の場合:

contextRadius: tok=('radius' 'change-authorize-nas-ip') (IP4_ADDRESS|IP6_ADDRESS) 'encrypted' 'key' ID 'port' INT_TOK 'event-timestamp-window' INT_TOK 'no-reverse-path-forward-check'
    ;

これは、正確には、「設定されていないブロック」であり、一般的な解決策があることを意味しますか?

4

1 に答える 1

16

不適切なラベルは次のとおりです。

tok=('radius' 'change-authorize-nas-ip')

この場合、ANTLRはトークンをラベルに割り当てるか'radius'トークン'change-authorize-nas-ip'をラベルに割り当てるかを知りませんtok。ANTLR 4以降では、セマンティクスが不明確なコードを生成するのではなく、エラーが発生します。ラベルを削除するかtok、目的のアイテムに移動する必要があります。つまり、次の3つの形式のいずれかを使用します。

('radius' 'change-authorize-nas-ip')
(tok='radius' 'change-authorize-nas-ip')
('radius' tok='change-authorize-nas-ip')

文法のブロックでラベルが許可される理由は、次のような項目をサポートするためです。このブロックはセットです。つまり、許可されたトークンの固定セットから正確に1つのトークンに一致するようにコンテンツを折りたたむことができます。次に、セットに一致する特定のアイテムがに割り当てられxます。

x=('a' | 'b')
于 2013-01-17T14:53:47.710 に答える