ANTLR 4语法不匹配输入中的多个解析器规则' xxx'期待' xxx'

时间:2017-03-03 08:08:07

标签: java antlr4 dsl

我是ANTLR4和DSL的新手。我想创建我的DSL。我尝试了基本的演示来了解它see here。现在我想在一个语法下定义多个规则(它们将代表相应Java类中的一个功能/函数)。在DSL输入(文本文件)中,我想随机使用规则并仅遍历那些规则(树)(不是所有规则)。

My grammar:
grammar Hello;
sayHello  : 'hello' STRING ';' ;

welcomeMessage : 'welcome' STRING ';' ;

newTest : 'newhello' STRING ';' ;

STRING : [a-zA-Z]+ ; 

WS : [ \t\r\n]+ -> skip ; 
public static void main( String[] args) throws Exception 
{
    ANTLRInputStream input = new ANTLRInputStream("hello world;"

         + "newhello newworld;" );

    HelloLexer lexer = new HelloLexer(input);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    HelloParser parser = new HelloParser(tokens);   
    parser.addParseListener(new MyHelloLister());

    // At runtime how to define which tree(parser function to invoke) to generate and traverse.
    // parser. sayHello(); // Error, because not traversed tree, and input is mismatched.
    // parser.welcomeMessage(); 
    parser.newTest();   

}
  

错误:第1行:0输入不匹配'你好'期待' newhello'

所以,我想知道从输入DSL文件,要调用的规则。有人能简单地给我一些想法吗?

1 个答案:

答案 0 :(得分:0)

好吧,你打电话给newTest()。 newTest的规则是:

newTest : 'newhello' STRING ';' ;

因此解析器需要类似“newhello abcdef;”的东西。但是你通过了“hello world; newhello newworld;”。这不是以“newhello”开头的,正如错误消息告诉你的那样。

您可以像这样更改规则(不是100%肯定ANTLR语法,所以你必须自己尝试):

newTest : welcomeMessage? 'newhello' STRING ';' ;

然后你的例子应该通过。