1

私はAntlrを初めて使用し、Antlr3を使用して基本的な文法を定義しました。

文法は以下のとおりです。

grammar data;

@header {
package com.data.language;
}


null        : 'null';
data        : null | STRING | INTEGER;
STRING  : ('a'..'z'|'A'..'Z')+;
INTEGER : '0'..'9'+;

これは完全に機能し、ANTLRWorksがコードを生成します。ただし、レクサー内でdataキーワードを使用したいと思います。例えば:

I : data '*' INTEGER;

問題は、これが実行されると、次の例外が発生することです。

Error 106: reference to undefined value: data

ANTLRWorksのグラフ内にデータが表示されません。Iレクサーの*INTEGERしか表示されません。

私がやろうとしていることは可能ですか?どうしてそれは可能ですか?

4

1 に答える 1

1

レクサーでパーサープロダクションを使用することはできません。レクサーはトークン(「単語」)を生成し、後でパーサーによって消費されますが、パーサーは単語のシーケンス(「フレーズ」)を認識します。レクサーレイヤーはパーサーレイヤーの下にあります。パーサーが何をしているかをレクサーに「学習」させる「フィードバックチャネル」はありません。

このようなパーサールール

data_star_int : data '*' INTEGER;

パーサールールはレクサートークンと他のパーサールールの両方を参照できるため、明らかに問題ありません。を使用して、data_star_intマルチトークンシーケンスを照合できます。

インライン*を名前付きトークンに置き換えますが、それは好みの問題です。

于 2012-11-21T15:28:10.653 に答える