0

Higuys、Byacc を使用してテキストを解析したい。テキストはスペースと改行によって明確に作成されます。1 つのテキストを解析するためのこれらのルールについてどう思いますか?

text: /* empty string */ {$$ = "";} 
      |TEXT {$$ = $1;}
      |TEXT whitespace text {$$ = $1 + $2  + $3;}
      |TEXT line whitespace text {$$ = $1 + $2 + $4;}

トークン TEXT は Jflex ファイルにあり、1 つの単語を表します。他の 2 つのルール、空白と行はダウンしています。

line : NL { $$ = System.lineSeparator(); }
      | line NL { $$ = $1 + System.lineSeparator(); }


 whitespace: WHITESPACE {$$ = " ";}
          |whitespace WHITESPACE {$$ = $1 + " ";}

私の「テキスト」のルールは間違っていますか?タクス

4

1 に答える 1

2

それ自体が「間違っている」ルールはありません。ルールとは、それが何であるかです。問題は、それがあなたがしたいことをするかということです。それで、あなたはそれを何にしたいですか?パーサーで何を受け入れ、構文エラーとして何を拒否しますか?

ルールtextは右再帰的であるため、多くのパーサー スタック スペースが必要になります (入力全体をスタックにプッシュしてから、右から左に減らします)。左再帰の方がよいでしょうが、何らかの理由で右から左へリダクションを行う必要がある場合は、右再帰で問題ありません。あなたのアクションには、連想的な文字列の連結だけであるため、右から左への削減が必要と思われるものは何もありません。

あなたのtextルールは、NLすぐに続くTEXT(または eof) を許可していません - whitespaceafterがなければなりませんline。それがあなたの望みなら、それでいいのです。

が開始文字列でない場合 (たとえば、 のような別のルールがある場合) text、空の文字列に一致すると競合が発生する可能性があります。textinput: text line | input text line;

于 2014-05-16T19:09:30.880 に答える