1

我正在使用 ANTLR 2.7.6,当我运行下一个类 Main.java

/**
 * @param args
 */
public static void main(String[] args) {
    FileInputStream fis;
    try {
        fis = new FileInputStream("src/main/entrada.txt");
        Analex analex = null;
        Anasint anasint = null;
        analex = new Analex(fis);
        anasint = new Anasint(analex);
        anasint.memberDecl();
        /*String[] tokens = anasint.get;
        for(int i = 0; i < tokens.length; i++) {
            System.out.println(tokens[i]);
        }*/
         CommonAST t = (CommonAST)anasint.getAST();
            // Print the resulting tree out in LISP notation
            System.out.println(t.toStringList());
        ASTFrame frame= new ASTFrame("AST-entrada.txt",t);
        frame.setVisible(true);

    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (RecognitionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (TokenStreamException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我收到以下错误: 第 3:30 行:期待 LT,找到 'l' 第 4:82 行:意外令牌:l 第 6:34 行:期待 GT,找到 '=' 第 6:58 行:期待 LT,找到'= ' 第 7:76 行:意外标记:l

我的 Parser.g 和我的 Lexer.g

class Anasint extends Parser;

options {
    buildAST = true;
}

memberDecl
    :   methodDeclaration
    ;

modifiers
    :
    (    
   PUBLIC
    |   PROTECTED
    |   PRIVATE
    |   STATIC
    |   ABSTRACT
    |   FINAL
    )*
    ;

variableModifiers
    :   (   FINAL
        )*
    ;

typeList
    :   type
        (COMMA type
        )*
    ;

typeParameters
    :   typeBound
        |
        LT
            typeParameter
            (COMMA typeParameter
            )*
        GT
    ;

typeParameter
    :   IDENTIFIER
        (EXTENDS typeBound
        )?
    ;


typeBound
    :   type
        (AMP type
        )*
    ;

methodDeclaration
    :
         modifiers
        (typeParameters)
        IDENTIFIER
        formalParameters
        (THROWS qualifiedNameList
        )?
        LBRACE
        (blockStatement
        )*
        RBRACE
    |   modifiers
        (typeParameters
        )?
        (type
        |   VOID
        )
        IDENTIFIER
        formalParameters
        (LBRACKET RBRACKET
        )*
        (THROWS qualifiedNameList
        )?
        (
            block
        |   SEMI
        )
    ;

/*fieldDeclaration
    :   modifiers
        type
        variableDeclarator
        (COMMA variableDeclarator
        )*
        SEMI
    ;*/

variableDeclarator
    :   IDENTIFIER
        (LBRACKET RBRACKET
        )*
        (EQ variableInitializer
        )?
    ;

interfaceMethodDeclaration
    :   modifiers
        (typeParameters
        )?
        (type
        |VOID
        )
        IDENTIFIER
        formalParameters
        (LBRACKET RBRACKET
        )*
        (THROWS qualifiedNameList
        )? SEMI
    ;

type
    :   primitiveType
        (LBRACKET RBRACKET
        )*
    ;

primitiveType
    :   BOOLEAN
    |   CHAR
    |   BYTE
    |   SHORT
    |   INT
    |   LONG
    |   FLOAT
    |   DOUBLE
    |   STRING
    ;

qualifiedNameList
    :   qualifiedName
        (COMMA qualifiedName
        )*
    ;

formalParameters
    :   LPAREN
        (formalParameterDecls
        )?
        RPAREN
    ;

formalParameterDecls
    :   normalParameterDecl
        (COMMA normalParameterDecl
        )*
    ;

normalParameterDecl
    :   variableModifiers type IDENTIFIER
        (LBRACKET RBRACKET
        )*
    ;

qualifiedName
    :   IDENTIFIER
        (DOT IDENTIFIER
        )*
    ;

/*elementValuePairs
    :   elementValuePair
        (COMMA elementValuePair
        )*
 //   ;

/*elementValuePair
    :   IDENTIFIER EQ elementValue
    ;

elementValue
    :   conditionalExpression
    |   elementValueArrayInitializer
    ;

elementValueArrayInitializer
    :   LBRACE
        (elementValue
            (COMMA elementValue
            )*
        )? (COMMA)? RBRACE
    ;  */

block
    :   LBRACE
        (blockStatement
        )*
        RBRACE
    ;

/*
staticBlock returns [JCBlock tree]
        @init {
            ListBuffer<JCStatement> stats = new ListBuffer<JCStatement>();
            int pos = ((AntlrJavacToken) $start).getStartIndex();
        }
        @after {
            $tree = T.at(pos).Block(Flags.STATIC, stats.toList());
            pu.storeEnd($tree, $stop);
            // construct a dummy static modifiers for end position
            pu.storeEnd(T.at(pos).Modifiers(Flags.STATIC,  com.sun.tools.javac.util.List.<JCAnnotation>nil()),$st);
        }
    :   st_1=STATIC LBRACE
        (blockStatement
            {
                if ($blockStatement.tree == null) {
                    stats.appendList($blockStatement.list);
                } else {
                    stats.append($blockStatement.tree);
                }
            }
        )* RBRACE
    ;
*/
blockStatement
    :   localVariableDeclarationStatement
    |   statement
    ;


localVariableDeclarationStatement
    :   localVariableDeclaration
        SEMI
    ;

localVariableDeclaration
    :   variableModifiers type
        variableDeclarator
        (COMMA variableDeclarator
        )*
    ;

statement
    :   block
    |   ASSERT  expression (COLON expression)? SEMI
    |   IF parExpression statement (ELSE statement)?
    |   forstatement
    |   WHILE parExpression statement
    |   DO statement WHILE parExpression SEMI
    |   trystatement
    |   SWITCH parExpression LBRACE switchBlockStatementGroups RBRACE
    |   SYNCHRONIZED parExpression block
    |   RETURN (expression )? SEMI
    |   THROW expression SEMI
    |   BREAK
            (IDENTIFIER
            )? SEMI
    |   CONTINUE
            (IDENTIFIER
            )? SEMI
    |   expression  SEMI
    |   IDENTIFIER COLON statement
    |   SEMI

    ;

switchBlockStatementGroups
    :   (switchBlockStatementGroup )*
    ;

switchBlockStatementGroup
    :
        switchLabel
        (blockStatement
        )*
    ;

switchLabel
    :   CASE expression COLON
    |   DEFAULT COLON
    ;


trystatement
    :   TRY block
        (   catches FINALLY block
        |   catches
        |   FINALLY block
        )
     ;

catches
    :   catchClause
        (catchClause
        )*
    ;

catchClause
    :   CATCH LPAREN formalParameter
        RPAREN block
    ;

formalParameter
    :   variableModifiers type IDENTIFIER
        (LBRACKET RBRACKET
        )*
    ;

forstatement
    :
        // enhanced for loop
        FOR LPAREN variableModifiers type IDENTIFIER COLON
        expression RPAREN statement

        // normal for loop
    |   FOR LPAREN
                (forInit
                )? SEMI
                (expression
                )? SEMI
                (expressionList
                )? RPAREN statement
    ;

forInit
    :   localVariableDeclaration
    |   expressionList
    ;

parExpression
    :   LPAREN expression RPAREN
    ;

expressionList
    :   expression
        (COMMA expression
        )*
    ;

expression
    :   conditionalExpression
        (assignmentOperator expression
        )?
    ;

assignmentOperator
    :   EQ
    |   PLUSEQ
    |   SUBEQ
    |   STAREQ
    |   SLASHEQ
    |   AMPEQ
    |   BAREQ
    |   CARETEQ
    |   PERCENTEQ
    |    LT LT EQ
    |    GT GT GT EQ
    |    GT GT EQ
    ;

conditionalExpression
    :   conditionalOrExpression
        (QUES expression COLON conditionalExpression
        )?
    ;

conditionalOrExpression
    :   conditionalAndExpression
        (BARBAR conditionalAndExpression
        )*
    ;

conditionalAndExpression
    :   inclusiveOrExpression
        (AMPAMP inclusiveOrExpression
        )*
    ;

inclusiveOrExpression
    :   exclusiveOrExpression
        (BAR exclusiveOrExpression
        )*
    ;

exclusiveOrExpression
    :   andExpression
        (CARET andExpression
        )*
    ;

andExpression
    :   equalityExpression
        (AMP equalityExpression
        )*
    ;

equalityExpression
    :   instanceOfExpression
        (
            (   EQEQ
            |   BANGEQ
            )
            instanceOfExpression
        )*
    ;

instanceOfExpression
    :   relationalExpression
        (INSTANCEOF type
        )?
    ;

relationalExpression
    :   shiftExpression
        (relationalOp shiftExpression
        )*
    ;

relationalOp
    :    LT EQ
    |    GT EQ
    |   LT
    |   GT
    ;

shiftExpression
    :   additiveExpression
        (shiftOp additiveExpression
        )*
    ;


shiftOp
    :    LT LT
    |    GT GT GT
    |    GT GT
    ;

additiveExpression
    :   multiplicativeExpression
        (
            (   PLUS
            |   SUB
            )
            multiplicativeExpression
         )*
    ;

multiplicativeExpression
    :
        unaryExpression
        (
            (   STAR
            |   SLASH
            |   PERCENT
            )
            unaryExpression
        )*
    ;

unaryExpression
    :   PLUS  unaryExpression
    |   SUB unaryExpression
    |   PLUSPLUS unaryExpression
    |   SUBSUB unaryExpression
    |   unaryExpressionNotPlusMinus
    ;

unaryExpressionNotPlusMinus
    :   TILDE unaryExpression
    |   BANG unaryExpression
    |   castExpression
    |   primary
        (selector
        )*
        (   PLUSPLUS
        |   SUBSUB
        )?
    ;

castExpression
    :   LPAREN primitiveType RPAREN unaryExpression
    |   LPAREN type RPAREN unaryExpressionNotPlusMinus
    ;

primary
    :   parExpression
    |   THIS
        (DOT IDENTIFIER
        )*
        (identifierSuffix
        )?
    |   IDENTIFIER
        (DOT IDENTIFIER
        )*
        (identifierSuffix
        )?
    |   SUPER
        superSuffix
    |   literal
    |   creator
    |   primitiveType
        (LBRACKET RBRACKET
        )*
        DOT CLASS
    |   VOID DOT CLASS
    ;


superSuffix
    :   arguments
    |   DOT (typeArguments
        )?
        IDENTIFIER
        (arguments
        )?
    ;

identifierSuffix
    :   (LBRACKET RBRACKET
        )+
        DOT CLASS
    |   (LBRACKET expression RBRACKET
        )+
    |   arguments
    |   DOT CLASS
    |   DOT nonWildcardTypeArguments IDENTIFIER arguments
    |   DOT THIS
    |   DOT SUPER arguments
    |   innerCreator
    ;

selector
    :   DOT IDENTIFIER
        (arguments
        )?
    |   DOT THIS
    |   DOT SUPER
        superSuffix
    |   innerCreator
    |   LBRACKET expression RBRACKET
    ;

creator
    :   NEW nonWildcardTypeArguments classOrInterfaceType classCreatorRest
    |   NEW classOrInterfaceType classCreatorRest
    |   arrayCreator
    ;

classBody
    :   LBRACE
        (classBodyDeclaration
        )*
        RBRACE
    ;

classBodyDeclaration
    :   SEMI
    |   (STATIC
        )?
        block
    |   memberDecl
    ;

classOrInterfaceType
    :   IDENTIFIER
        (typeArguments
        )?
        (DOT IDENTIFIER
            (typeArguments
            )?
        )*
    ;

arrayCreator
    :   NEW createdName
        LBRACKET RBRACKET
        (LBRACKET RBRACKET
        )*
        arrayInitializer

    |   NEW createdName
        LBRACKET expression
        RBRACKET
        (   LBRACKET expression
            RBRACKET
        )*
        (LBRACKET RBRACKET
        )*
    ;

variableInitializer
    :   arrayInitializer
    |   expression
    ;

arrayInitializer
    :   LBRACE
            (variableInitializer
                (COMMA variableInitializer
                )*
            )?
            (COMMA)?
        RBRACE             //Yang's fix, position change.
    ;


createdName
    :   classOrInterfaceType
    |   primitiveType
    ;

innerCreator
    :   DOT NEW
        (nonWildcardTypeArguments
        )?
        IDENTIFIER
        (typeArguments
        )?
        classCreatorRest
    ;

typeArguments
    :   LT typeArgument
        (COMMA typeArgument
        )*
        GT
    ;

typeArgument
    :   type
    |   QUES
        (
            (EXTENDS
            |SUPER
            )
            type
        )?
    ;

classCreatorRest
    :   arguments
        (classBody
        )?
    ;


nonWildcardTypeArguments
    :   LT typeList
        GT
    ;

arguments
    :   LPAREN (expressionList
        )? RPAREN
    ;

literal
    :   INTLITERAL
    |   LONGLITERAL
    |   FLOATLITERAL
    |   DOUBLELITERAL
    |   CHARLITERAL
    |   STRINGLITERAL
    |   TRUE
    |   FALSE
    |   NULL
    ;



 class Analex extends Lexer;

options {
    importVocab = Anasint;
    charVocabulary = '\0'..'\377';
    k = 3;
}

LONGLITERAL
    :   IntegerNumber LongSuffix
    ;


INTLITERAL
    :   IntegerNumber
    ;

IntegerNumber
    :   '0'
    |   '1'..'9' ('0'..'9')*
    |   '0' ('0'..'7')+
    ;

LongSuffix
    :   'l' | 'L'
    ;


NonIntegerNumber
    :   ('0' .. '9')+ '.' ('0' .. '9')* 
    |   '.' ( '0' .. '9' )+
    |   ('0' .. '9')+
        ;

FloatSuffix
    :   'f' | 'F'
    ;

DoubleSuffix
    :   'd' | 'D'
    ;

FLOATLITERAL
    :   NonIntegerNumber FloatSuffix
    ;

DOUBLELITERAL
    :   NonIntegerNumber DoubleSuffix
    ;

CHARLITERAL
    :   '\''
        (   EscapeSequence
        |   ~( '\'' | '\\' | '\r' | '\n' )
        )
        '\''
    ;

STRINGLITERAL
    :   '"'
        (   EscapeSequence
        |   ~( '\\' | '"' | '\r' | '\n' )
        )*
        '"'
    ;

EscapeSequence
    :   '\\' (
                 'b'
             |   't'
             |   'n'
             |   'f'
             |   'r'
             |   '\"'
             |   '\''
             |   '\\'
             |
                 ('0'..'3') ('0'..'7') ('0'..'7')
             |
                 ('0'..'7') ('0'..'7')
             |
                 ('0'..'7')
             )
;

COMMENT
    : "/*" (options{greedy=false;}:(NUEVA_LINEA|.))* "*/"
    {$setType(Token.SKIP);};

LINE_COMMENT
    : "//" (~'\r')*
    {$setType(Token.SKIP);};

ABSTRACT
    :   "abstract"
    ;

ASSERT
    :   "assert"
    ;

BOOLEAN
    :   "boolean"
    ;

BREAK
    :   "break"
    ;

BYTE
    :   "byte"
    ;

CASE
    :   "case"
    ;

CATCH
    :   "catch"
    ;

CHAR
    :   "char"
    ;

CONTINUE
    :   "continue"
    ;

DEFAULT
    :   "default"
    ;

DO
    :   "do"
    ;

DOUBLE
    :   "double"
    ;

ELSE
    :   "else"
    ;

ENUM
    :   "enum"
    ;

FINAL
    :   "final"
    ;

FINALLY
    :   "finally"
    ;

FLOAT
    :   "float"
    ;

FOR
    :   "for"
    ;

IF
    :   "if"
    ;

INSTANCEOF
    :   "instanceof"
    ;

INT
    :   "int"
    ;

INTERFACE
    :   "interface"
    ;

LONG
    :   "long"
    ;

NEW
    :   "new"
    ;

PRIVATE
    :   "private"
    ;

PROTECTED
    :   "protected"
    ;

PUBLIC
    :   "public"
    ;

RETURN
    :   "return"
    ;

SHORT
    :   "short"
    ;

STATIC
    :   "static"
    ;

EXTENDS
    :   "extends"
    ;

SUPER
    :   "super"
    ;

SWITCH
    :   "switch"
    ;

SYNCHRONIZED
    :   "synchronized"
    ;

THIS
    :   "this"
    ;

THROW
    :   "throw"
    ;

THROWS
    :   "throws"
    ;

TRY
    :   "try"
    ;

VOID
    :   "void"
    ;

WHILE
    :   "while"
    ;

TRUE
    :   "true"
    ;

FALSE
    :   "false"
    ;

NULL
    :   "null"
    ;

LPAREN
    :   '('
    ;

RPAREN
    :   ')'
    ;

LBRACE
    :   '{'
    ;

RBRACE
    :   '}'
    ;

LBRACKET
    :   '['
    ;

RBRACKET
    :   ']'
    ;

SEMI
    :   ';'
    ;

COMMA
    :   ','
    ;

DOT
    :   '.'
    ;

ELLIPSIS
    :   "..."
    ;

EQ
    :   '='
    ;

BANG
    :   '!'
    ;

TILDE
    :   '~'
    ;

QUES
    :   '?'
    ;

COLON
    :   ':'
    ;

EQEQ
    :   "=="
    ;

AMPAMP
    :   "&&"
    ;

BARBAR
    :   "||"
    ;

PLUSPLUS
    :   "++"
    ;

SUBSUB
    :   "--"
    ;

PLUS
    :   '+'
    ;

SUB
    :   '-'
    ;

STAR
    :   '*'
    ;

STRING
    :   "String"
    ;

SLASH
    :   '/'
    ;

AMP
    :   '&'
    ;

BAR
    :   '|'
    ;

CARET
    :   '^'
    ;

PERCENT
    :   '%'
    ;

PLUSEQ
    :   "+="
    ;

SUBEQ
    :   "-="
    ;

STAREQ
    :   "*="
    ;

SLASHEQ
    :   "/="
    ;

AMPEQ
    :   "&="
    ;

BAREQ
    :   "|="
    ;

CARETEQ
    :   "^="
    ;

PERCENTEQ
    :   "%="
    ;

MONKEYS_AT
    :   '@'
    ;

BANGEQ
    :   "!="
    ;

GT
    :   '>'
    ;

LT
    :   '<'
    ;

IDENTIFIER
        : ('a'..'z' | 'A'..'Z'|'_')('a'..'z' | 'A'..'Z'|'0'..'9'|'_')*
    ;

protected NUEVA_LINEA : "\r\n" 
{newline();};

BLANCO : (' '|'\t'|NUEVA_LINEA)
{$setType(Token.SKIP);};
4

0 回答 0