📄 mwsimplepaspar.pas
字号:
procedure TmwSimplePasPar.ExceptionVariable;
begin
Expected(ptIdentifier);
end;
procedure TmwSimplePasPar.InlineStatement;
begin
Expected(ptInline);
Expected(ptRoundOpen);
Expected(ptIntegerConst);
while (TokenID = ptSlash) do
begin
NextToken;
Expected(ptIntegerConst);
end;
Expected(ptRoundClose);
end;
procedure TmwSimplePasPar.AsmStatement;
begin
Expected(ptAsm);
{ should be replaced with a Assembler lexer }
while TokenID <> ptEnd do
case fLexer.TokenID of
ptBegin, ptCase, ptEnd, ptIf, ptFunction, ptProcedure, ptRepeat, ptwhile: break;
ptAddressOp:
begin
NextToken;
NextToken;
end;
ptDoubleAddressOp:
begin
NextToken;
NextToken;
end;
else NextToken;
end;
Expected(ptEnd);
end;
procedure TmwSimplePasPar.RaiseStatement;
begin
Expected(ptRaise);
case TokenID of
ptAddressOp, ptDoubleAddressOp, ptIdentifier, ptPointerSymbol, ptRoundOpen:
begin
Designator;
end;
end;
if ExID = ptAt then
begin
NextToken;
Expression;
end;
end;
procedure TmwSimplePasPar.TryStatement;
begin
Expected(ptTry);
StatementList;
case TokenID of
ptExcept:
begin
NextToken;
ExceptBlock;
Expected(ptEnd);
end;
ptFinally:
begin
NextToken;
StatementList;
Expected(ptEnd);
end;
else
begin
SynError(InvalidTryStatement);
end;
end;
end;
procedure TmwSimplePasPar.WithStatement;
begin
Expected(ptWith);
VariableList;
Expected(ptDo);
Statement;
end;
procedure TmwSimplePasPar.VariableList;
begin
VariableReference; (* acessing func.recordfield not allowed here;as well as UNITNAMEID *)
while fLexer.TokenID = ptComma do
begin
NextToken;
VariableReference;
end;
end;
procedure TmwSimplePasPar.StatementList;
begin
while TokenID in [ptAddressOp, ptAsm, ptBegin, ptCase, ptDoubleAddressOp,
ptFor, ptGoTo, ptIdentifier, ptIf, ptInherited, ptInline, ptIntegerConst,
ptPointerSymbol, ptRaise, ptRoundOpen, ptRepeat, ptSemiColon, ptString,
ptTry, ptWhile, ptWith] do
begin
Statement;
SEMICOLON;
end;
end;
procedure TmwSimplePasPar.SimpleStatement;
begin
case TokenID of
ptAddressOp, ptDoubleAddressOp, ptIdentifier, ptPointerSymbol, ptRoundOpen:
begin
Designator;
if TokenID = ptAssign then
begin
NextToken;
if TokenID = ptInherited then
begin
NextToken;
end;
Expression;
end;
end;
ptGoTo:
begin
NextToken;
LabelId;
end;
end;
end;
procedure TmwSimplePasPar.Statement;
begin
case TokenID of
ptAsm:
begin
AsmStatement;
end;
ptBegin:
begin
CompoundStatement;
end;
ptCase:
begin
CaseStatement;
end;
ptFor:
begin
ForStatement;
end;
ptIf:
begin
IfStatement;
end;
ptIdentifier:
begin
fLexer.InitAhead;
case Lexer.AheadTokenID of
ptColon:
begin
LabeledStatement;
end;
else
begin
SimpleStatement;
end;
end;
end;
ptInherited:
begin
InheritedStatement;
end;
ptInLine:
begin
InlineStatement;
end;
ptIntegerConst:
begin
fLexer.InitAhead;
case Lexer.AheadTokenID of
ptColon:
begin
LabeledStatement;
end;
else
begin
SynError(InvalidLabeledStatement);
end;
end;
end;
ptRepeat:
begin
RepeatStatement;
end;
ptRaise:
begin
RaiseStatement;
end;
ptSemiColon:
begin
EmptyStatement;
end;
ptString:
begin
StringStatement;
end;
ptTry:
begin
TryStatement;
end;
ptWhile:
begin
WhileStatement;
end;
ptWith:
begin
WithStatement;
end;
else
begin
SimpleStatement;
end;
end;
end;
procedure TmwSimplePasPar.EmptyStatement;
begin
{ Nothing to do here.
The semicolon will be removed in StatementList }
end;
procedure TmwSimplePasPar.InheritedStatement;
begin
Expected(ptInherited);
case TokenID of
ptSemiColon: ;
else
begin
Statement;
end;
end;
end;
procedure TmwSimplePasPar.LabeledStatement;
begin
case TokenID of
ptIdentifier:
begin
NextToken;
Expected(ptColon);
Statement;
end;
ptIntegerConst:
begin
NextToken;
Expected(ptColon);
Statement;
end;
else
begin
SynError(InvalidLabeledStatement);
end;
end;
end;
procedure TmwSimplePasPar.StringStatement;
begin
Expected(ptString);
Statement;
end;
procedure TmwSimplePasPar.SetElement;
begin
Expression;
if TokenID = ptDotDot then
begin
NextToken;
Expression;
end;
end;
procedure TmwSimplePasPar.QualifiedIdentifier;
begin
Expected(ptIdentifier);
if TokenID = ptPoint then
begin
NextToken;
Expected(ptIdentifier);
end;
end;
procedure TmwSimplePasPar.SetConstructor;
begin
Expected(ptSquareOpen);
SetElement;
while TokenID = ptComma do begin
NextToken;
SetElement;
end;
Expected(ptSquareClose);
end;
procedure TmwSimplePasPar.Number;
begin
case TokenID of
ptFloat:
begin
NextToken;
end;
ptIntegerConst:
begin
NextToken;
end;
ptIdentifier:
begin
NextToken;
end;
else
begin
SynError(InvalidNumber);
end;
end;
end;
procedure TmwSimplePasPar.ExpressionList;
begin
Expression;
while TokenID = ptComma do
begin
NextToken;
Expression;
end;
end;
procedure TmwSimplePasPar.Designator;
begin
VariableReference;
end;
procedure TmwSimplePasPar.MultiplicativeOperator;
begin
case TokenID of
ptAnd:
begin
NextToken;
end;
ptDiv:
begin
NextToken;
end;
ptMod:
begin
NextToken;
end;
ptShl:
begin
NextToken;
end;
ptShr:
begin
NextToken;
end;
ptSlash:
begin
NextToken;
end;
ptStar:
begin
NextToken;
end;
else begin SynError(InvalidMultiplicativeOperator);
end;
end;
end;
procedure TmwSimplePasPar.Factor;
begin
case TokenID of
ptAsciiChar, ptStringConst:
begin
CharString;
end;
ptAddressOp, ptDoubleAddressOp, ptIdentifier, ptInherited, ptPointerSymbol,
ptRoundOpen:
begin
Designator;
end;
ptIntegerConst, ptFloat:
begin
Number;
end;
ptNil:
begin
NextToken;
end;
ptMinus:
begin
NextToken;
Factor;
end;
ptNot:
begin
NextToken;
Factor;
end;
ptPlus:
begin
NextToken;
Factor;
end;
ptSquareOpen:
begin
SetConstructor;
end;
ptString:
begin
NextToken;
Factor;
end;
end;
end;
procedure TmwSimplePasPar.AdditiveOperator;
begin
if TokenID in [ptMinus, ptOr, ptPlus, ptXor] then
begin
case TokenID of
ptMinus, ptPlus:
begin
while TokenID in [ptMinus, ptPlus] do
case TokenID of
ptMinus:
begin
NextToken;
end;
ptPlus:
begin
NextToken;
end;
end;
end;
ptOr:
begin
NextToken;
end;
ptXor:
begin
NextToken;
end;
end;
end else
begin
SynError(InvalidAdditiveOperator);
end;
end;
procedure TmwSimplePasPar.Term;
begin
Factor;
while TokenID in [ptAnd, ptDiv, ptMod, ptShl, ptShr, ptSlash, ptStar] do
begin
MultiplicativeOperator;
Factor;
end;
end;
procedure TmwSimplePasPar.RelativeOperator;
begin
case TokenID of
ptAs:
begin
NextToken;
end;
ptEqual:
begin
NextToken;
end;
ptGreater:
begin
NextToken;
end;
ptGreaterEqual:
begin
NextToken;
end;
ptIn:
begin
NextToken;
end;
ptIs:
begin
NextToken;
end;
ptLower:
begin
NextToken;
end;
ptLowerEqual:
begin
NextToken;
end;
ptNotEqual:
begin
NextToken;
end;
else
begin
SynError(InvalidRelativeOperator);
end;
end;
end;
procedure TmwSimplePasPar.SimpleExpression;
begin
while TokenID in [ptMinus, ptPlus] do
begin
NextToken;
end;
Term;
while TokenID in [ptMinus, ptOr, ptPlus, ptXor] do
begin
AdditiveOperator;
Term;
end;
end;
procedure TmwSimplePasPar.Expression;
begin
SimpleExpression;
case TokenID of
ptEqual, ptGreater, ptGreaterEqual, ptLower, ptLowerEqual, ptIn, ptIs,
ptNotEqual:
begin
RelativeOperator;
SimpleExpression;
end;
ptColon:
begin
case fInRound of
False: ;
True:
while TokenID = ptColon do
begin
NextToken;
SimpleExpression;
end;
end;
end;
end;
end;
procedure TmwSimplePasPar.VarDeclaration;
begin
VarNameList;
Expected(ptColon);
TypeKind;
case GenID of
ptAbsolute:
begin
VarAbsolute;
end;
ptEqual:
begin
VarEqual;
end;
end;
end;
procedure TmwSimplePasPar.VarAbsolute;
begin
ExpectedEx(ptAbsolute);
ConstantValue;
end;
procedure TmwSimplePasPar.VarEqual;
begin
Expected(ptEqual);
ConstantValueTyped;
end;
procedure TmwSimplePasPar.VarNameList;
begin
VarName;
while TokenID = ptComma do
begin
NextToken;
VarName;
end;
end;
procedure TmwSimplePasPar.VarName;
begin
Expected(ptIdentifier);
end;
procedure TmwSimplePasPar.DirectiveCalling;
begin
case ExID of
ptCdecl:
begin
NextToken;
end;
ptPascal:
begin
NextToken;
end;
ptRegister:
begin
NextToken;
end;
ptSafeCall:
begin
NextToken;
end;
ptStdCall:
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -