我正在用python编写一个简单的命题逻辑公式解析器,它使用正则表达式re模块和lex/yacc模块进行词法分析/解析。最初,我的代码可以将隐含式识别为->,但是添加逻辑等价(<->)会导致编译后的表达式出现问题
IMPLICATION = re.compile('[\s]*\-\>[\s]*')
EQUIVALENCE = re.compile('[\s]*\<\-\>[\s]*')
...
elif self.IMPLICATION.search(formula[0].strip()):
...
elif self.EQUIVALENCE.search(formula[0].strip()):
...我最初尝试在->的前面添加^<,让它忽略等价的实例,但这只是让它根本不接受任何隐含的实例。任何可能的帮助都将受到热烈欢迎:)
发布于 2009-02-05 04:59:25
据我所知,您的正则表达式等同于以下内容:
# This is bad, because IMPLICATION also will match every
# string that EQUIVALENCE matches
IMPLICATION = re.compile("->")
EQUIVALENCE = re.compile("<->")在编写代码时,还需要在->和<->文字之前匹配零个或多个空格字符。但是您没有捕获空格,所以指定“匹配是否存在空格”是没有用的。还要注意,在这些正则表达式中不需要对-和>进行转义。
在我看来,你有两个选择。第一种方法是确保IMPLICATION不与EQUIVALENCE匹配相同的字符串
# This ought to work just fine.
IMPLICATION = re.compile("[^<]->")
EQUIVALENCE = re.compile("<->")另一种选择是使用maximal munch method;即,匹配所有正则表达式,并选择最长的匹配。这将通过给予等价比隐含更高的优先级来解决歧义。
发布于 2009-02-05 04:00:43
我认为您可以简单地通过重新排序检查来解决这个问题,首先匹配等价项,然后再进行暗示。然而,这似乎是可行的:
>>> IMPLICATION = re.compile(r'\s*[^\<]\-\>\s*')
>>> EQUIVALENCE = re.compile(r'\s*\<\-\>\s*')https://stackoverflow.com/questions/514475
复制相似问题