在Java中,我想编写一个语法匹配器。
string1: a = a+b, and string2: c = c+d, syntax_matcher(string1,string2) = true.
但是,if string1 : a > 0; string2 : c == 0, syntax_matcher(string1,string2) = false.
任何想法,如何有效地做到这一点?
答案 0 :(得分:4)
也许您可以做的就是写一个Stack
并且第一个语句从左向右移动,推送VAR
然后ASSIGNMENT
,然后是VAR
等值,然后OPERATOR
然后VAR
。
一旦你有了这个,你可以从第二个表达开始,然后从从右到左,每次比较你从堆栈中弹出的内容。
您正在阅读的内容与弹出的内容之间的任何不匹配都会产生false
。
答案 1 :(得分:1)
使用LR-parser (Wikipedia)来解析表达式,因为它们可能是无上下文的语言。对于Java,您可能希望使用例如CUP open-source parser generator。
然后使用您喜欢的树比较方法比较得到的syntax trees (Wikipedia)。
有关常规和无上下文语言的区别,请参阅Chomsky Hierarchy (Wikipedia)。