0

だから私はyeccを使おうとしています。

Terminals string string_delimeter.

Nonterminals value string_content.

Rootsymbol value.

value -> string : extract_value('$1').

value -> string_delimeter string_content string_delimeter : '$2'.
string_content -> value string_content : ['$1' | '$2'].
string_content -> value : '$1'.

Erlang code.

extract_value({_, Value}) -> Value.

入力の場合:

[string_delimeter: '\'', string: 'test', string_delimeter: '\'']

私は得る

{:error, {:undefined, :standard_syntax_parser, ['syntax error before: ', []]}}

string_content を囲む (左または右の) string_delimiter を削除すると、次のようになります。

value -> string_delimeter string_content string_delimeter : '$2'.

value -> string_delimeter string_content : '$2'.

為に

[string_delimeter: '\'', string: 'test']

戻ります

{:ok, 'test'}

この動作がよくわかりません。問題はどこにありますか?

4

3 に答える 3

0

入力の場合:

[string_delimeter: '\'', string: 'test', string_delimeter: '\'']

私はあなたが混乱していると思います (または多分それは私です!)。 yeccトークンのリストが必要です。トークンは 2 つまたは 3 つの要素のタプルです。yecc ドキュメントから:

ユーザーは、入力テキストをセグメント化し、それを 1 つ以上のトークンのリストに変換するスキャナーを実装する必要があります。各トークンは、構文カテゴリ、テキスト内の位置 (行番号など)、およびテキスト内で見つかった実際の終端記号に関する情報を含むタプルである必要があります: {Category, LineNumber, Symbol}.

終端記号がカテゴリの唯一のメンバーであり、記号名がカテゴリ名と同じである場合、トークンの形式は次のようになり {Symbol, LineNumber}ます。

yecc が期待するものの例を次に示します。

[
     {'[',1},
     {atom,1,foo},
     {',',1},
     {'[',1},
     {int,1,1},
     {']',1},
     {',',1},
     {'[',1},
     {atom,1,bar},
     {',',1},
     {'[',1},
     {int,1,2},
     {',',1},
     {int,1,3}, 
     {']',1},
     {']',1},
     {']',1}
]

このようなスキャナーを で実装し、出力をパーサーleexにフィードできます。yecc

アドバイス: コードをどのように実行したかを説明する質問を投稿しないでください。それは時間の無駄です。代わりに、実行した正確なコマンドと、それらのコマンドが生成した出力をコピーして貼り付けます。あなたが言わなければならないことはすべてです:

  1. これは私が試したものです:

[コードはこちら]

  1. 出力は次のとおりです。

[実行したすべてのコマンドと出力はこちら]

  1. これは私が期待/したい出力、またはWtf ??!!です が進行中です。

[ここで期待される/望ましい出力]

于 2019-07-21T18:30:09.470 に答える