私はCプログラムを書いたとし、printf
の代わりにprint
と書いたとします。
今私の質問は、コンパイラのどの部分がこれを検出するのですか?printf()の代わりにprintf()の代わりにコンパイラの部分が検出される
答えて
私は、GCC/LLVMについて具体的に知ることがない等
レクサー、パーサー、型分析、名前アナライザ、コードジェネレータとして、OPは、内部コンパイラのどの部分を意味すると仮定していName Analyzerであると仮定します(具体的には、これは一般的に「Semantic Analyzer」の一種であり、Type Analysisも含みます)。そのため、「print」と名前が一致するもの。 x
が以前に存在しない場合
x = 5;
:これは、次のようなものを防ぎ、同じことです。
厳密に言えば、print
がフォームでトークンによって表されると仮定する:トークン内のソース文字から
{ token type = Identifier, token value = 'print' }
この変換は、字句解析器により行われます。あなたは関数get_token
を持っていて、ソースファイルの文字を読み込んでトークンを返します(上記の構造体の形で)。ソースファイルは、そのようなトークンのシーケンスとみなされます。
上位レベルのジョブを実行するには、下位レベルのルーチンを呼び出します。get_token
を使用する関数parse_declaration
があるとします。 parse_declaration
はプログラム内の宣言を認識します(これは解析アルゴリズム(例えばrecursive descent
)を使用して行われます)。宣言が認識されると、型情報と属性を持つシンボルテーブルにtoken value
を保存します。
今、あなたが機能parse_expression
を持っていると仮定し、それはget_token
を呼び出します、とtoken type
がIdentifier
であれば、それはname lookup
を実行します。つまり、シンボルテーブルのtoken value
を検索します。検索に失敗すると、エラーメッセージ("token value : undeclared identifier"
のようなもの)が出力されます。
もちろん、この概念は単純化されています。実際には、字句解析、構文解析、セマンティクス(言語の振る舞い、名前の検索は言語セマンティクスの一部)のためのかなり洗練されたロジックがあり、このロジックは可能な限り互いに独立している必要があります。
- 1. は、効率的にbashでのprintf%sの代わりに
- 2. ストア結果Varの代わりにprintfの
- 3. 新しい行の代わりに同じ行にprintfの値を更新
- 4. Perlでprintfの代わりに何を使うべきですか?
- 5. pythonに2.7の代わりに2.7の代わりにインストールされたモジュール
- 6. (?、5、1、1)の代わりにconv2dの出力(?、5,1,1)の代わりに
- 7. の代わりに
- 8. が、代わりに
- 9. SSOの代わりにSelenium Webdriverの代わりに
- 10. MySQLの代わりにCOUNT(*)OVER(PARTITION BY mct.MasterTableid)の代わりに
- 11. java印刷の代わりに0の代わりに
- 12. asp.netの代わりにasp.netの代わりにmvc
- 13. 、代わりの
- 14. 現代のフレームの代わりに?
- 15. 古代の "マーキー"タグの代わりに?
- 16. toucheswithの代わりにtouchescancelledが呼び出されました
- 17. シンボリックリンクの代わりにCwd :: abs_pathに代わるPerl
- 18. ASP.NET MVC5 Webアプリケーションの代わりにMessageBox.Showの代わりになるもの
- 19. divの代わりにdivの代わりにJSのプリペンドを使用する
- 20. コマンドパターンを検索する代わりに
- 21. これは、代わりに
- 22. 代わりにevent.srcElement.id
- 23. 代わりにgroup_concat
- 24. Entirerow.Clearcontentsに代わり
- 25. 代わりにギャラリーウィジェット
- 26. 代わりにクラス
- 27. SpinWait.SpinUntilに代わり
- 28. 代わりに幅
- 29. スケールまたはprintfで切り捨てる代わりにbcスケールを切り上げます
- 30. 代わりに、コードの下
おそらく、文をトークン化しようとするときのパーサです。 – wally
@Jonathanなぜあなたはその質問から[tag:C++]タグを削除しましたか?どのようにそれなしで質問が意味をなすのですか? –
@πάνταῥεῖ:タイトルはCプログラムに関するものです。もしあなたが好きなら、それを元に戻してください。私はあなたがC++に関する何かをタグだけでなく質問に追加している限り、再編集には賛成できません。 C++タグを無意味にするC++に関するタグ以外は何もありません。 –