3

ドラゴンブックを読んでいます。本からのテキストの引用 (3.1.4 語彙エラー、Pno 114)

字句解析器が、他のコンポーネントの助けなしに、ソース コード エラーがあることを判断するのは困難です。たとえばfi、コンテキスト内の C プログラムで文字列が初めて検出された場合:

fi ( a == f(x) ) ...

語彙アナライザーは fi、キーワードのスペルミスなの ifか、宣言されていない関数識別子なのかを判断できません。はトークン ID の有効な語彙素であるためfi、字句解析器はトークンidをパーサーに返し、コンパイラーの他のフェーズ (この場合はおそらくパーサー) に文字の転置によるエラーを処理させる必要があります。

これを読んだ後、私は少し混乱しています。私の理解では、字句解析器は左から右にテキストの処理を開始し、パターンが一致するたびにトークンを返します。一致するキーワードがある言語の場合if、どのように一致させることができfiますか?

何かご意見は?

4

4 に答える 4

7

ifトークンとは一致しませんがid、「識別子」を表すトークンと一致します。一致するキーワードがない場合は、キャッチオールです。字句解析器は、特定の位置で何を「期待」するかを知りません。トークンを返すだけで、パーサーは何を期待しているかを認識します。AC パーサーは、関数呼び出しである次のステートメントを受け入れる必要があります。

fi ( a  == f(x) );
于 2010-07-10T18:10:55.607 に答える
2

構文解析と字句解析を区別する必要があります。

  • 字句解析のタスクは、一連の文字をトークンの文字列に変換することです。IDENTIFIER、ADDITION OPERATOR、END OF STATEMENT OPERATOR など、さまざまなタイプのトークンが存在する可能性があります。字句解析は、どのトークンにも対応しないテキストの文字列に遭遇した場合にのみ、エラーで失敗する可能性があります。あなたの場合、 .....fi ( a == f(x) ) ...に変換されます<IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <EQUALITY> <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <RIGHT BRACKET> <RIGHT BRACKET>

  • トークンの文字列が生成されると、構文解析が実行されます。これには通常、トークンからある種の構文ツリーを構築することが含まれます。パーサーは、言語で許可されている有効なステートメントのすべての形式を認識しています。上記の一連のトークンを許可する構文規則が見つからない場合、パーサーは失敗します。

于 2010-07-10T18:15:12.913 に答える
1

これは、字句解析エラーの説明の例として不適切です。このテキストが伝えようとしているのは、「if」キーワードのつづりが間違っている (逆に書かれている) ことをコンパイラーが認識できないということです。たとえば、有効な変数名である「fi」を確認するだけで、ID(たとえば)「VARIABLE」がパーサーに返されます。パーサーは後で構文エラーを認識します。

左から右または右から左に移動することとは何の関係もありません。もちろん、コンパイラはソースコードを左から右に読み取ります。私が言ったように、この説明のキーワードの選択は不適切です。

于 2010-07-10T18:12:24.280 に答える
1

if特定の時点で期待される唯一の入力であるかどうかをどのように判断しますか?

int a = 42;
if (a == 42)
    puts("ok");

対。

int a = 42;
fi (a == 42)
    puts("ok");

fi関数呼び出しかもしれません。たとえば、上記は次のスペルミスの可能性があります。

int a = 42;
fi(a == 42);
puts("ok");

ここでは を受け取って返すfi関数です。intvoid

于 2010-07-10T18:11:26.473 に答える