Java antlr4中的不匹配

Java antlr4中的不匹配,java,debugging,antlr4,Java,Debugging,Antlr4,我最近一直收到不匹配错误,我想知道是否有人可以检查并看到我的代码中的任何缺陷 这是我的语法文件: grammar foo; program: codeBlock EOF; codeBlock : 'begin' statement* 'end'; statement : print|variableDec|changeValue|ifState; variableDec : Var ID IS (STRING|NUMBER); print : Output (STRING|I

我最近一直收到不匹配错误,我想知道是否有人可以检查并看到我的代码中的任何缺陷

这是我的语法文件:

grammar foo;

program: codeBlock EOF;

codeBlock : 'begin'  statement* 'end';


statement  : print|variableDec|changeValue|ifState;


variableDec : Var ID IS (STRING|NUMBER);


print : Output (STRING|ID);


changeValue : ID IS (ID|NUMBER|STRING);


ifState: IF expressionState block;



block: '{' statement+ '}';




expressionState : (NUMBER|ID|STRING) EXPRESSION (NUMBER|ID|STRING);


EXPRESSION : 
'>'|
'<'|
'=='|
'>='|
'<='
;



IF: 'if';
Var: 'var';
Output : 'output';
IS: '=';
ID : [A-z]+;
NUMBER : [0-9]+ ;
STRING : ["] ( ~["\r\n\\] | '\\' ~[\r\n] )* ["] | ['] ( ~['\r\n\\] |  '\\' ~[\r\n] )* ['];
WS : [ \n\t]+ -> skip;
Comment: '**' ~( '\r' | '\n' )* -> skip;
我得到这个输出:

run:
Hello World
line 10:0 mismatched input '<EOF>' expecting 'begin'
BUILD SUCCESSFUL (total time: 0 seconds)
最后是我的访客课程:

public class FooVisitor extends fooBaseVisitor{

private Map<String, Object> variable;

@Override
public Object visitIfState(fooParser.IfStateContext ctx)
{
    //do if statement later... use .clear and .accept functions
    return true;
}

@Override
public Object visitVariableDec(fooParser.VariableDecContext ctx)
{
    String name = ctx.ID(0).getText();
    Object value = null;
    if(ctx.NUMBER() != null)
    {
        value = Integer.parseInt(ctx.NUMBER().getText());

    }
    if(ctx.STRING() != null)
    {
        value = ctx.STRING().getText();
    }

    if(ctx.ID(1) != null)
    {
        value = variable.get(ctx.ID(1).getText());
    }
    return variable.put(name, value);
}

@Override
public Object visitChangeValue(fooParser.ChangeValueContext ctx)
{
   String varName = ctx.ID(0).getText();
    if(ctx.ID(1) != null)
    {



        variable.put(varName, variable.get(ctx.ID(1).getText()));
    }
    if(ctx.STRING() != null)
    {



        variable.put(varName, ctx.STRING().getText());
    }
    if(ctx.NUMBER() != null)
    {



        variable.put(varName, Integer.parseInt(ctx.NUMBER().getText()));
    }

    return null;

}

@Override
public Object visitPrint(fooParser.PrintContext ctx)
{
    String printText = null;
    if(ctx.ID() != null)
    {
       printText = variable.get(ctx.ID().getText()).toString();
       if(variable.get(ctx.ID().getText()) instanceof String)
       {
           printText = printText.replace("\"", "");
       }
    }else
    {
        printText = ctx.STRING().getText();
    }

    System.out.println(printText);
    return printText;
}





/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException {
    fooLexer lexer = new fooLexer(new ANTLRFileStream(args[0]));
    fooParser parser = new fooParser(new CommonTokenStream(lexer));
    ParseTree tree = parser.program();
    FooVisitor vistor = new FooVisitor();
    vistor.visit(tree);

    // Start parsing
    parser.program(); 

}

public FooVisitor() {
    //init the variables
    this.variable = new HashMap<>();
}
}

如果有人能在我的代码或语法文件中发现任何缺陷,请指出。谢谢

编辑:添加了访问者类。

您正在调用parser.program两次,分别是主方法的第三行和第八行。由于第一次调用消耗了所有输入,并且您没有在其间重置输入流,所以解析器的第二次运行从文件末尾开始并失败。这就是为什么它期待在第8行开始


删除第二个调用,它将正常工作。

仔细检查您实际向解析器提供的内容。您描述的错误很可能是由于输入为空。也就是说,您认为您向解析器发送了包含的代码,但实际上您发送了空文本或根本没有文本。我刚刚验证了您的语法ANTLR 4.7,它解析示例文本/代码时没有问题。@user3890638谢谢,但我不太明白您的意思是什么?我有一个visitor类,它符合解析的代码。您能再解释一下吗?谢谢。您能告诉我们如何调用解析器吗?你有没有可能在一个循环中这样做?@sepp2k那里我添加了visitor类
public class FooVisitor extends fooBaseVisitor{

private Map<String, Object> variable;

@Override
public Object visitIfState(fooParser.IfStateContext ctx)
{
    //do if statement later... use .clear and .accept functions
    return true;
}

@Override
public Object visitVariableDec(fooParser.VariableDecContext ctx)
{
    String name = ctx.ID(0).getText();
    Object value = null;
    if(ctx.NUMBER() != null)
    {
        value = Integer.parseInt(ctx.NUMBER().getText());

    }
    if(ctx.STRING() != null)
    {
        value = ctx.STRING().getText();
    }

    if(ctx.ID(1) != null)
    {
        value = variable.get(ctx.ID(1).getText());
    }
    return variable.put(name, value);
}

@Override
public Object visitChangeValue(fooParser.ChangeValueContext ctx)
{
   String varName = ctx.ID(0).getText();
    if(ctx.ID(1) != null)
    {



        variable.put(varName, variable.get(ctx.ID(1).getText()));
    }
    if(ctx.STRING() != null)
    {



        variable.put(varName, ctx.STRING().getText());
    }
    if(ctx.NUMBER() != null)
    {



        variable.put(varName, Integer.parseInt(ctx.NUMBER().getText()));
    }

    return null;

}

@Override
public Object visitPrint(fooParser.PrintContext ctx)
{
    String printText = null;
    if(ctx.ID() != null)
    {
       printText = variable.get(ctx.ID().getText()).toString();
       if(variable.get(ctx.ID().getText()) instanceof String)
       {
           printText = printText.replace("\"", "");
       }
    }else
    {
        printText = ctx.STRING().getText();
    }

    System.out.println(printText);
    return printText;
}





/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException {
    fooLexer lexer = new fooLexer(new ANTLRFileStream(args[0]));
    fooParser parser = new fooParser(new CommonTokenStream(lexer));
    ParseTree tree = parser.program();
    FooVisitor vistor = new FooVisitor();
    vistor.visit(tree);

    // Start parsing
    parser.program(); 

}

public FooVisitor() {
    //init the variables
    this.variable = new HashMap<>();
}