我是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文件,要调用的规则。有人能简单地给我一些想法吗?
答案 0 :(得分:0)
好吧,你打电话给newTest()
。 newTest的规则是:
newTest : 'newhello' STRING ';' ;
因此解析器需要类似“newhello abcdef;”的东西。但是你通过了“hello world; newhello newworld;”。这不是以“newhello”开头的,正如错误消息告诉你的那样。
您可以像这样更改规则(不是100%肯定ANTLR语法,所以你必须自己尝试):
newTest : welcomeMessage? 'newhello' STRING ';' ;
然后你的例子应该通过。