#include<stdio.h>
int main()
{
int a,b;
a=a+b;
printf("%d",a);
return 0;
}
このコードがレクサーを介して渡された場合の出力
レクサーはストリームをトークン化して、文字のストリームをトークンのストリームに変換します (後でパーサーで解析して完全な構文ツリーを取得します)。あなたの例では、次のようなものを取得します。
#include <stdio.h> (this is handled by preprocessor, not by lexer so it wouldn't exist)
int KEYWORD
main IDENTIFIER
( LPAR
) RPAR
{ LBRACE
int KEYWORD
a IDENT
, COMMA
b IDENT
; SEMICOL
a IDENT
= ASSIGN
a IDENT
+ PLUS
b IDENT
; SEMICOL
printf IDENT
( LPAR
"%d" STRING
, COMMA
a IDENT
) RPAR
; SEMICOL
return RETURN_KEYWORD
0 INTEGER
; SEMICOL
} RBRACE
もちろん、レクサー自体は多くのことを行うことはできません。ソースを可能な限り最小の要素に分割し、構文エラー (キーワードのスペルミスなど) をチェックするだけです。それらを組み合わせて意味的な意味を与えるものが必要になります。
補足: 一部のレクサーは、関連付けられたパラメーターを使用して、類似した種類のトークンを 1 つだけ (たとえば、すべてのキーワードを含むトークン) にグループ化することを好みますが、他のレクサーは、 などのように、KEYWORD
トークンごとに異なるトークンを持ちます。RETURN_KEYWORK
IF_KEYWORD
プリプロセッサ ディレクティブは、プリプロセッサによって消費されるため、コンパイラへの入力には含まれません。その#include<stdio.h>
ため、ファイルの内容に置き換えられstdio.h
ます。
結果のファイルは、ここにあるに従って に分割さtokens
れ、トークンを要求するときに に渡されます。scanner
lexical rules
parser