教材习题
PL/0词法分析伪代码
START: token = ""; GetNBC;
REVERSE:=["const", "var", "procedure", "if", "then", "while", "do", "call",
"begin", "end", "read", "write", "odd"];
SEPERATOR:=["+", "-", "*", "/", "(", ")", ";", ",", ":=", "=", "<", ">",
"<=", ">=", "<>"];
CASE CHAR of
'a'...'z':
BEGIN
WHILE IsLeter OR IsDigit DO
BEGIN CAT; getchar; END;
UnGetCH;
C:= SymbolOf(REVERSE); /* token如果等于其中某个identifier,则返回其Symbol*/
IF C=0 THEN RETURN("IdentifierSym", token);
ELSE RETURN(C, -);
END;
'0'...'9':
BEGIN
WHILE IsDigit DO
BEGIN CAT; getchar END;
UnGetCH;
RETURN ("IntSym",ATOI)
END;
'+': RETURN("PlusSym", -);
'-': RETURN("SubtractSym", -);
'*': RETURN("MultiplySym", -);
'/': RETURN("DivideSym", -);
'(': RETURN("LParSym", -);
')': RETURN("RParSym", -);
'(': RETURN("LParSym", -);
';': RETURN("SemicolonSym", -);
'=': RETURN("EqualSym", -);
',': RETURN('CommaSym', -);
':':
BEGIN
getchar;
IF CHAR='=' THEN RETURN("AssignSym", -);
ELSE UnGetCH; ERROR;
END;
'<':
BEGIN
getchar;
CASE CHAR of
'=': RETURN("LEQSym", -);
'>': RETURN("NEQSym", -);
END OF CASE;
UnGetCH;
RETURN("LTSym", -);
END;
'>':
BEGIN
getchar;
IF CHAR='=' THEN RETURN("BEQSym", -);
UnGetCH;
RETURN("BTSym", -);
END;
ERROR;
END OF CASE;
GOTO START;