Antlr4 有没有一种语言不可知的方法可以在解析器中执行简单的谓词? 目标

Antlr4 有没有一种语言不可知的方法可以在解析器中执行简单的谓词? 目标,antlr4,Antlr4,我想减少(或消除)解析器中特定于Java的操作和谓词。也许这是不可能的,但我想在这里问一下,以防我错过了ANTLR4的一些特性。(语言本身是第三方的,所以我无法控制它。) 简化示例 我想使用的谓词大多是精确的(或者不区分大小写)字符串匹配。我可以创建大型并行解析器规则集,但我不希望这样,因为现实生活中的示例要复杂得多 假设我得到了类似于: isWidget(int) : "Whether it is a widget" : 4 ; ownerFirstName(string) : "john"

我想减少(或消除)解析器中特定于Java的操作和谓词。也许这是不可能的,但我想在这里问一下,以防我错过了ANTLR4的一些特性。(语言本身是第三方的,所以我无法控制它。)

简化示例 我想使用的谓词大多是精确的(或者不区分大小写)字符串匹配。我可以创建大型并行解析器规则集,但我不希望这样,因为现实生活中的示例要复杂得多

假设我得到了类似于:

isWidget(int) : "Whether it is a widget" : 4 ;
ownerFirstName(string) : "john" ;
ownerLastName(string) : "This is the last-name of the owner" : "doe" ;
我希望解析器查看默认值(行中的最后一项,如
4
“john”
“doe”
),并基于前面的类型
(int)
(string)
(string)
对其进行解析


我知道我可以用谓词和规则输入来实现这一点,但是我已经从语言无关的语法过渡到了嵌入Java代码的语法。

您的解析器应该可以毫无问题地处理以下内容:

isWidget(int) : "Whether it is a widget" : "foo" ;

换句话说,不要添加在这种情况下会失败的谓词,否则您将失去报告正常错误消息的能力。相反,如果默认值的类型与声明的类型不匹配,请在解析完成后使用特定于语言的侦听器或访问者实现来报告语义错误。

谢谢,我目前正在通过
parsetRewalker
运行侦听器,并在出现异常时抛出
ParseCancellationException
。我已经研究过使用
Parser.addParseListener()
进行不太可预测的“实时”监听,但我猜在这种情况下,没有必要进行早期检测或干预。
isWidget(int) : "Whether it is a widget" : "foo" ;