unit uSymbolType;
interface
uses
Classes;
const
CNT_Ident_MaxLen = 10; //---标识符最长长度
CNT_Number_MaxLen = 14; //---数字允许的最长位数
type
//---标识符
TIdent = packed array[1..CNT_Ident_MaxLen] of char;
//---单词类型
TSymbolType = (symEof,symNull,
symIdent,symNumber,
symOdd,
symPlus,symMinus,symTimes,symSlash,
symEql,symNeq,symLss,symLeq,symGtr,symGeq,
symLparen,symRparen,symSLparen,symSRparen,symComma,symSemicolon,symPeriod,
symBecomes,
symBegin,symEnd,symIf,symThen,symElse,symWhile,symDo,symRepeat,symUntil,
symWrite, symRead,symCall,
symConst,symVar,symProc);
TSymbolTypes = set of TSymbolType;
//---单词
TSymbol = record
Kind: TSymbolType;
Ident: TIdent;
Num: integer;
end;
const
//--关键字
CNT_KeywordMap: array[1..16] of TIdentMapEntry = (
(Value: Integer(symBegin); Name: 'begin '),
(Value: Integer(symCall); Name: 'call '),
(Value: Integer(symConst); Name: 'const '),
(Value: Integer(symDo); Name: 'do '),
(Value: Integer(symElse); Name: 'else '),
(Value: Integer(symEnd); Name: 'end '),
(Value: Integer(symIf); Name: 'if '),
(Value: Integer(symOdd); Name: 'odd '),
(Value: Integer(symProc); Name: 'procedure '),
(Value: Integer(symRead); Name: 'read '),
(Value: Integer(symRepeat); Name: 'repeat '),
(Value: Integer(symThen); Name: 'then '),
(Value: Integer(symUntil); Name: 'until '),
(Value: Integer(symVar); Name: 'var '),
(Value: Integer(symWhile); Name: 'while '),
(Value: Integer(symWrite); Name: 'write ')
);
CNT_SignNames: array[symPlus..symBecomes] of string = (
'+', '-', '*', '/',
'=', '#', '<', '<=', '>', '>=',
'(', ')', '[', ']', ',', ';', '.',
':='
);
sysDeclBeg = [symConst,symVar,symProc]; //--"声明"开始符号集合
sysStatBeg = [symBegin,symCall,symIf,symWhile]; //---"语句"开始符号集合
sysFacBeg = [symIdent,symNumber,symLparen]; //--"项"开始符号集合
var
//--符号表
SignMap: array[char] of TSymbolType;
implementation
procedure InitSignMap;
var
ch: char;
begin
for ch := low(SignMap) to High(SignMap) do
SignMap[ch] := symNull;
//---
SignMap['+'] := symPlus;
SignMap['-'] := symMinus;
SignMap['*'] := symTimes;
SignMap['/'] := symSlash;
SignMap['='] := symEql;
SignMap['#'] := symNeq;
SignMap['('] := symLparen;
SignMap[')'] := symRparen;
SignMap['['] := symSLparen;
SignMap[']'] := symSRparen;
SignMap[','] := symComma;
SignMap['.'] := symPeriod;
SignMap[';'] := symSemicolon;
end;
initialization
InitSignMap;
finalization
end.