其实编译的核心是语法分析和符号组织,语法分析你这样理解可能容易一些:
如
ascal语言中的Type定义
Type
TSocket=LongInt;
为了翻译这个结构,你可以这样设想: 建立一个符号表
SymbolTable=Record
Name: String;
Ident: Integer;
BaseType: Integer;
End;
当读到Type时,可知后面将是类型定义,类型定义的产生式如下:[...]表示后面
还有非终结符 <> 表示必须存在的项 () 表示后面为空 | 表示或
<Ident> -> <','|'='>[...]
<','> -> <Ident>[...]
<'='> -> <类型定义>
根据这个产生式,你就可以编制程序了,如:
假设从Type之后开始分析
Var
Name: String;
Begin
While True Do
Begin
if GetToken.Ident<>ID_IDENT Then Error(Syntaxerror);
if Token.Name in SymbolTable Then Error(VarReDefine);
Name:=Token.Name;
Case GetToken.Ident of
SYM_COMMA: //','
Begin
AddToTmpSymbolTable(Name);
End;
SYM_EQUAL: //'='
Begin
if GetToken.Ident<>ID_IDENT Then Error(Syntaxerror);
if Not isAlreadyDefineType(Token.Name) Then Error(TypeNotSuport)
ResetTmpSymbolTable(NowType);
InsertTmpSymbolTable Into SymbolTable;
End;
End;
End;
End;