0

コンパイラの実装に取り​​組んでおり、ファイルの終わりに達したかどうかを確認したいですか?

これは lex ファイルの yywrap() 関数を使用して実行できることはわかっていますが、必要なのは、EOF が 16 進値 0x1a のように明示的に定義されている場合、それをどのように参照するかということです。

例:

main() { printf("EOFマーカーをチェック\n"); '0x1a' <-- 実際の EOF マーカー。

上記が構文エラーではなく、エラーとして報告されるようにしたい

上記はできますか?私の要件は、パーサーに EOF トークンを含めることだけですが、残念ながら、日付までそれを行うことができませんでした:-((、残りの作業は簡単に実行できます。ルールを指定するだけですそのような:

print    :    print_stmt '(' stmt_valid ')' colon '\n' 
{
    OK do the rest
}
         |    print_stmt '(' stmt_valid ')' colon end_indicator
{
    print error message and close application.
}
4

1 に答える 1

3

lexer が EOF のトークンを返すようにします。

次の 2 つの場合にトークンを返すことをお勧めします。

  1. getc()返さ-1れます (通常の EOF 記号)。この場合、トークン テキストを空にします。

  2. getc()返され'\x1a'ました。この場合、この文字をトークン テキストに入れます。

これにより、文法でこれら 2 つのケースを区別できます。

于 2008-12-08T11:01:52.177 に答える