2

レクサーを flex で生成しました。

[ \t\n\r\v]          /* skip whitespace */

[_a-zA-Z]([_a-zA-Z]|[0-9])*  printf("IDENT\n");
[0-9]+        printf("INTEGER\n");
[0-9]+\.      printf("DOUBLE\n");

C で独自のパーサーを作成したいのですが、レクサーからトークンを取得する方法がわかりません。yylex() 呼び出しに「lexer.c」を含める必要がありますか? 次に、printf() を呼び出す代わりに列挙型を返す必要があります。bison/yacc を使わずにこれを行う最善の方法は何ですか?

4

1 に答える 1

1

終了する前にその文法を拡張する必要がありますが...

  • はい、printf()ステートメントを適切なreturnステートメントに置き換えます
  • (または、より可能性が高い/より良いのは、printステートメントを保持してreturnステートメントを追加することです)。
  • アクションを' { ... }'中括弧で囲みます。
  • トークンタイプとトークン値をパーサーにどのように伝達するかを検討する必要があります。

yylex()標準的な方法は、Flexによって生成される関数からトークンタイプを返すことです。ylvalトークン値を伝達するために使用できるグローバル変数、があります。そのタイプを制御できます。途中でトークン番号(トークンタイプ)を指定する必要があることに注意してください。これは、列挙型または一連の#defines。従来、情報はパーサーによって字句解析プログラムに提供されます。つまり、Yaccは使用する予定のトークン番号のリストを提供し、Flexはそれらの番号を使用します(より正確には、Flexによって生成されたコードのreturnステートメントでこれらの番号を使用します)。

レクサーからパーサーにトークンを取得するには、yylex();を呼び出す必要があります。通常はパーサーとは別にコンパイルしますが、本当に必要な場合は、生成されたソースをパーサーファイルに含めることもできます。

于 2010-11-25T00:17:06.933 に答える