📄 parser.java
字号:
{ Operator opAST = parseOperator(); Expression eAST = parsePrimaryExpression(); finish(expressionPos); expressionAST = new UnaryExpression(opAST, eAST, expressionPos); } break; case Token.LPAREN: acceptIt(); expressionAST = parseExpression(); accept(Token.RPAREN); break; default: syntacticError("\"%\" cannot start an expression", currentToken.spelling); break; } return expressionAST; } RecordAggregate parseRecordAggregate() throws SyntaxError { RecordAggregate aggregateAST = null; // in case there's a syntactic error SourcePosition aggregatePos = new SourcePosition(); start(aggregatePos); Identifier iAST = parseIdentifier(); accept(Token.IS); Expression eAST = parseExpression(); if (currentToken.kind == Token.COMMA) { acceptIt(); RecordAggregate aAST = parseRecordAggregate(); finish(aggregatePos); aggregateAST = new MultipleRecordAggregate(iAST, eAST, aAST, aggregatePos); } else { finish(aggregatePos); aggregateAST = new SingleRecordAggregate(iAST, eAST, aggregatePos); } return aggregateAST; } ArrayAggregate parseArrayAggregate() throws SyntaxError { ArrayAggregate aggregateAST = null; // in case there's a syntactic error SourcePosition aggregatePos = new SourcePosition(); start(aggregatePos); Expression eAST = parseExpression(); if (currentToken.kind == Token.COMMA) { acceptIt(); ArrayAggregate aAST = parseArrayAggregate(); finish(aggregatePos); aggregateAST = new MultipleArrayAggregate(eAST, aAST, aggregatePos); } else { finish(aggregatePos); aggregateAST = new SingleArrayAggregate(eAST, aggregatePos); } return aggregateAST; }/////////////////////////////////////////////////////////////////////////////////// VALUE-OR-VARIABLE NAMES///////////////////////////////////////////////////////////////////////////////// Vname parseVname () throws SyntaxError { Vname vnameAST = null; // in case there's a syntactic error Identifier iAST = parseIdentifier(); vnameAST = parseRestOfVname(iAST); return vnameAST; } Vname parseRestOfVname(Identifier identifierAST) throws SyntaxError { SourcePosition vnamePos = new SourcePosition(); vnamePos = identifierAST.position; Vname vAST = new SimpleVname(identifierAST, vnamePos); while (currentToken.kind == Token.DOT || currentToken.kind == Token.LBRACKET) { if (currentToken.kind == Token.DOT) { acceptIt(); Identifier iAST = parseIdentifier(); vAST = new DotVname(vAST, iAST, vnamePos); } else { acceptIt(); Expression eAST = parseExpression(); accept(Token.RBRACKET); finish(vnamePos); vAST = new SubscriptVname(vAST, eAST, vnamePos); } } return vAST; }/////////////////////////////////////////////////////////////////////////////////// DECLARATIONS///////////////////////////////////////////////////////////////////////////////// Declaration parseDeclaration() throws SyntaxError { Declaration declarationAST = null; // in case there's a syntactic error SourcePosition declarationPos = new SourcePosition(); start(declarationPos); declarationAST = parseSingleDeclaration(); while (currentToken.kind == Token.SEMICOLON) { acceptIt(); Declaration d2AST = parseSingleDeclaration(); finish(declarationPos); declarationAST = new SequentialDeclaration(declarationAST, d2AST, declarationPos); } return declarationAST; } Declaration parseSingleDeclaration() throws SyntaxError { Declaration declarationAST = null; // in case there's a syntactic error SourcePosition declarationPos = new SourcePosition(); start(declarationPos); switch (currentToken.kind) { case Token.CONST: { acceptIt(); Identifier iAST = parseIdentifier(); accept(Token.IS); Expression eAST = parseExpression(); finish(declarationPos); declarationAST = new ConstDeclaration(iAST, eAST, declarationPos); } break; case Token.VAR: { acceptIt(); Identifier iAST = parseIdentifier(); accept(Token.COLON); TypeDenoter tAST = parseTypeDenoter(); finish(declarationPos); declarationAST = new VarDeclaration(iAST, tAST, declarationPos); } break; case Token.PROC: { acceptIt(); Identifier iAST = parseIdentifier(); accept(Token.LPAREN); FormalParameterSequence fpsAST = parseFormalParameterSequence(); accept(Token.RPAREN); accept(Token.IS); Command cAST = parseSingleCommand(); finish(declarationPos); declarationAST = new ProcDeclaration(iAST, fpsAST, cAST, declarationPos); } break; case Token.FUNC: { acceptIt(); Identifier iAST = parseIdentifier(); accept(Token.LPAREN); FormalParameterSequence fpsAST = parseFormalParameterSequence(); accept(Token.RPAREN); accept(Token.COLON); TypeDenoter tAST = parseTypeDenoter(); accept(Token.IS); Expression eAST = parseExpression(); finish(declarationPos); declarationAST = new FuncDeclaration(iAST, fpsAST, tAST, eAST, declarationPos); } break; case Token.TYPE: { acceptIt(); Identifier iAST = parseIdentifier(); accept(Token.IS); TypeDenoter tAST = parseTypeDenoter(); finish(declarationPos); declarationAST = new TypeDeclaration(iAST, tAST, declarationPos); } break; default: syntacticError("\"%\" cannot start a declaration", currentToken.spelling); break; } return declarationAST; }/////////////////////////////////////////////////////////////////////////////////// PARAMETERS///////////////////////////////////////////////////////////////////////////////// FormalParameterSequence parseFormalParameterSequence() throws SyntaxError { FormalParameterSequence formalsAST; SourcePosition formalsPos = new SourcePosition(); start(formalsPos); if (currentToken.kind == Token.RPAREN) { finish(formalsPos); formalsAST = new EmptyFormalParameterSequence(formalsPos); } else { formalsAST = parseProperFormalParameterSequence(); } return formalsAST; } FormalParameterSequence parseProperFormalParameterSequence() throws SyntaxError { FormalParameterSequence formalsAST = null; // in case there's a syntactic error; SourcePosition formalsPos = new SourcePosition(); start(formalsPos); FormalParameter fpAST = parseFormalParameter(); if (currentToken.kind == Token.COMMA) { acceptIt(); FormalParameterSequence fpsAST = parseProperFormalParameterSequence(); finish(formalsPos); formalsAST = new MultipleFormalParameterSequence(fpAST, fpsAST, formalsPos); } else { finish(formalsPos); formalsAST = new SingleFormalParameterSequence(fpAST, formalsPos); } return formalsAST; } FormalParameter parseFormalParameter() throws SyntaxError { FormalParameter formalAST = null; // in case there's a syntactic error; SourcePosition formalPos = new SourcePosition(); start(formalPos); switch (currentToken.kind) { case Token.IDENTIFIER: { Identifier iAST = parseIdentifier(); accept(Token.COLON); TypeDenoter tAST = parseTypeDenoter(); finish(formalPos); formalAST = new ConstFormalParameter(iAST, tAST, formalPos); } break; case Token.VAR: { acceptIt(); Identifier iAST = parseIdentifier(); accept(Token.COLON); TypeDenoter tAST = parseTypeDenoter(); finish(formalPos); formalAST = new VarFormalParameter(iAST, tAST, formalPos); } break; case Token.PROC: { acceptIt(); Identifier iAST = parseIdentifier(); accept(Token.LPAREN); FormalParameterSequence fpsAST = parseFormalParameterSequence(); accept(Token.RPAREN); finish(formalPos); formalAST = new ProcFormalParameter(iAST, fpsAST, formalPos); } break; case Token.FUNC: { acceptIt(); Identifier iAST = parseIdentifier(); accept(Token.LPAREN); FormalParameterSequence fpsAST = parseFormalParameterSequence(); accept(Token.RPAREN); accept(Token.COLON); TypeDenoter tAST = parseTypeDenoter(); finish(formalPos); formalAST = new FuncFormalParameter(iAST, fpsAST, tAST, formalPos); } break; default: syntacticError("\"%\" cannot start a formal parameter", currentToken.spelling); break; } return formalAST; } ActualParameterSequence parseActualParameterSequence() throws SyntaxError { ActualParameterSequence actualsAST; SourcePosition actualsPos = new SourcePosition(); start(actualsPos); if (currentToken.kind == Token.RPAREN) { finish(actualsPos); actualsAST = new EmptyActualParameterSequence(actualsPos); } else { actualsAST = parseProperActualParameterSequence(); } return actualsAST; } ActualParameterSequence parseProperActualParameterSequence() throws SyntaxError { ActualParameterSequence actualsAST = null; // in case there's a syntactic error SourcePosition actualsPos = new SourcePosition(); start(actualsPos); ActualParameter apAST = parseActualParameter(); if (currentToken.kind == Token.COMMA) { acceptIt(); ActualParameterSequence apsAST = parseProperActualParameterSequence(); finish(actualsPos); actualsAST = new MultipleActualParameterSequence(apAST, apsAST, actualsPos); } else { finish(actualsPos); actualsAST = new SingleActualParameterSequence(apAST, actualsPos); } return actualsAST; } ActualParameter parseActualParameter() throws SyntaxError { ActualParameter actualAST = null; // in case there's a syntactic error SourcePosition actualPos = new SourcePosition(); start(actualPos); switch (currentToken.kind) { case Token.IDENTIFIER: case Token.INTLITERAL: case Token.CHARLITERAL: case Token.OPERATOR: case Token.LET: case Token.IF: case Token.LPAREN: case Token.LBRACKET: case Token.LCURLY: { Expression eAST = parseExpression(); finish(actualPos); actualAST = new ConstActualParameter(eAST, actualPos); } break; case Token.VAR: { acceptIt(); Vname vAST = parseVname(); finish(actualPos); actualAST = new VarActualParameter(vAST, actualPos); } break; case Token.PROC: { acceptIt(); Identifier iAST = parseIdentifier(); finish(actualPos); actualAST = new ProcActualParameter(iAST, actualPos); } break; case Token.FUNC: { acceptIt(); Identifier iAST = parseIdentifier(); finish(actualPos); actualAST = new FuncActualParameter(iAST, actualPos); } break; default: syntacticError("\"%\" cannot start an actual parameter", currentToken.spelling); break; } return actualAST; }/////////////////////////////////////////////////////////////////////////////////// TYPE-DENOTERS///////////////////////////////////////////////////////////////////////////////// TypeDenoter parseTypeDenoter() throws SyntaxError { TypeDenoter typeAST = null; // in case there's a syntactic error SourcePosition typePos = new SourcePosition(); start(typePos); switch (currentToken.kind) { case Token.IDENTIFIER: { Identifier iAST = parseIdentifier(); finish(typePos); typeAST = new SimpleTypeDenoter(iAST, typePos); } break; case Token.ARRAY: { acceptIt(); IntegerLiteral ilAST = parseIntegerLiteral(); accept(Token.OF); TypeDenoter tAST = parseTypeDenoter(); finish(typePos); typeAST = new ArrayTypeDenoter(ilAST, tAST, typePos); } break; case Token.RECORD: { acceptIt(); FieldTypeDenoter fAST = parseFieldTypeDenoter(); accept(Token.END); finish(typePos); typeAST = new RecordTypeDenoter(fAST, typePos); } break; default: syntacticError("\"%\" cannot start a type denoter", currentToken.spelling); break; } return typeAST; } FieldTypeDenoter parseFieldTypeDenoter() throws SyntaxError { FieldTypeDenoter fieldAST = null; // in case there's a syntactic error SourcePosition fieldPos = new SourcePosition(); start(fieldPos); Identifier iAST = parseIdentifier(); accept(Token.COLON); TypeDenoter tAST = parseTypeDenoter(); if (currentToken.kind == Token.COMMA) { acceptIt(); FieldTypeDenoter fAST = parseFieldTypeDenoter(); finish(fieldPos); fieldAST = new MultipleFieldTypeDenoter(iAST, tAST, fAST, fieldPos); } else { finish(fieldPos); fieldAST = new SingleFieldTypeDenoter(iAST, tAST, fieldPos); } return fieldAST; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -