我想在我的解析器中减少(或消除)特定于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"
),并根据较早的类型解析它{ {1}},(int)
,(string)
。
(string)
我知道我可以使用谓词和规则输入来完成它,但后来我从语言无关的语法到嵌入式Java代码的语法。
答案 0 :(得分:0)
您的解析器应该处理以下内容而不会出现问题:
isWidget(int) : "Whether it is a widget" : "foo" ;
换句话说,不会添加在这种情况下会失败的谓词,否则您将无法报告合理的错误消息。相反,如果默认值的类型与声明的类型不匹配,请在解析完成后使用特定于语言的侦听器或访问器实现来报告语义错误。