我正在尝试使用Parsec为命题演算编写解析器.解析器使用Text.Parsec.Expr中的buildExpressionParser函数.这是我定义逻辑运算符的代码.
operators = [ [Prefix (string "~" >> return Negation)]
, [binary "&" Conjunction]
, [binary "|" Disjunction]
, [binary "->" Conditional]
, [binary "<->" Biconditional]
]
binary n c = Infix (spaces >> string n >> spaces >> return c) AssocRight
expr = buildExpressionParser operators term
<?> "compound expression"
Run Code Online (Sandbox Code Playgroud)
我省略了变量,术语和括号表达式的解析器,但如果您认为它们可能与问题相关,则可以阅读解析器的完整源代码.
解析器成功使用仅使用否定和连接的表达式,即唯一的前缀运算符和第一个中缀运算符.
*Data.Logic.Propositional.Parser2> runPT expr () "" "p & ~q"
Right (p ? ¬q)
Run Code Online (Sandbox Code Playgroud)
使用任何其他运算符的表达式在运算符的第一个字符上失败,出现如下错误:
*Data.Logic.Propositional.Parser2> runPT expr () "" "p | …Run Code Online (Sandbox Code Playgroud)