PL/0语言编译程序整理实现:(2)、单词类型

来源:互联网 发布:到处微博转发点赞数据 编辑:程序博客网 时间:2024/05/22 16:52

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.

 

原创粉丝点击