⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.java

📁 The triangle language processor will be consist of a compiler, an interpreter, and a disassembler
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
      {        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 + -