6
#include<stdio.h>

int main()
{
  int a,b;
  a=a+b;
  printf("%d",a);
return 0;
}

このコードがレクサーを介して渡された場合の出力

4

2 に答える 2

14

レクサーはストリームをトークン化して、文字のストリームをトークンのストリームに変換します (後でパーサーで解析して完全な構文ツリーを取得します)。あなたの例では、次のようなものを取得します。

#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_KEYWORKIF_KEYWORD

于 2010-04-18T12:43:30.550 に答える
4

プリプロセッサ ディレクティブは、プリプロセッサによって消費されるため、コンパイラへの入力には含まれません。その#include<stdio.h>ため、ファイルの内容に置き換えられstdio.hます。

結果のファイルは、ここにあるに従って に分割さtokensれ、トークンを要求するときに に渡されます。scannerlexical rulesparser

于 2010-04-18T12:43:15.340 に答える