2016-05-07 5 views
-3

私はCプログラムを書いたとし、printfの代わりにprintと書いたとします。
今私の質問は、コンパイラのどの部分がこれを検出するのですか?printf()の代わりにprintf()の代わりにコンパイラの部分が検出される

+1

おそらく、文をトークン化しようとするときのパーサです。 – wally

+0

@Jonathanなぜあなたはその質問から[tag:C++]タグを削除しましたか?どのようにそれなしで質問が意味をなすのですか? –

+1

@πάνταῥεῖ:タイトルはCプログラムに関するものです。もしあなたが好きなら、それを元に戻してください。私はあなたがC++に関する何かをタグだけでなく質問に追加している限り、再編集には賛成できません。 C++タグを無意味にするC++に関するタグ以外は何もありません。 –

答えて

3

私は、GCC/LLVMについて具体的に知ることがない等

レクサー、パーサー、型分析、名前アナライザ、コードジェネレータとして、OPは、内部コンパイラのどの部分を意味すると仮定していName Analyzerであると仮定します(具体的には、これは一般的に「Semantic Analyzer」の一種であり、Type Analysisも含みます)。そのため、「print」と名前が一致するもの。 xが以前に存在しない場合

x = 5;

:これは、次のようなものを防ぎ、同じことです。

0

厳密に言えば、printがフォームでトークンによって表されると仮定する:トークン内のソース文字から

{ token type = Identifier, token value = 'print' } 

この変換は、字句解析器により行われます。あなたは関数get_tokenを持っていて、ソースファイルの文字を読み込んでトークンを返します(上記の構造体の形で)。ソースファイルは、そのようなトークンのシーケンスとみなされます。

上位レベルのジョブを実行するには、下位レベルのルーチンを呼び出します。get_tokenを使用する関数parse_declarationがあるとします。 parse_declarationはプログラム内の宣言を認識します(これは解析アルゴリズム(例えばrecursive descent)を使用して行われます)。宣言が認識されると、型情報と属性を持つシンボルテーブルにtoken valueを保存します。

今、あなたが機能parse_expressionを持っていると仮定し、それはget_tokenを呼び出します、とtoken typeIdentifierであれば、それはname lookupを実行します。つまり、シンボルテーブルのtoken valueを検索します。検索に失敗すると、エラーメッセージ("token value : undeclared identifier"のようなもの)が出力されます。

もちろん、この概念は単純化されています。実際には、字句解析、構文解析、セマンティクス(言語の振る舞い、名前の検索は言語セマンティクスの一部)のためのかなり洗練されたロジックがあり、このロジックは可能な限り互いに独立している必要があります。

関連する問題