我想寫使用秒差距命題演算的分析器。解析器使用Text.Parsec.Expr中的buildExpressionParser
函數。以下是定義邏輯運算符的代碼。爲什麼只有第一個定義的中綴運算符在使用Parsec的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"
我省略解析器爲變量,術語和parenthesised表達式,但如果你認爲他們可能是相關的問題,你可以閱讀full source for the parser。
解析器成功用於使用僅否定和結合,即只有前綴操作者和所述第一操作者綴表達式。使用其他運營商
*Data.Logic.Propositional.Parser2> runPT expr() "" "p & ~q"
Right (p ∧ ¬q)
表達式失敗於操作的第一個字符,通過類似以下的錯誤:
*Data.Logic.Propositional.Parser2> runPT expr() "" "p | q"
Left (line 1, column 3):
unexpected "|"
expecting space or "&"
如果我註釋掉定義連詞解析器行,那麼解析器拆分會起作用(但其餘部分仍然會失敗)。將它們全部放入單個列表(即具有相同的優先級)也不起作用:同樣的問題仍然表現出來。
任何人都可以指出我做錯了什麼?非常感謝。
感謝Daniel Fischer對此提示和幫助。
爲了完成使這個解析器正常工作,我也需要處理否定符號的重複應用,使如~~p
會解析正確。 This SO answer教我怎麼做,我給解析器所做的更改可以發現here。
非常感謝Daniel的回答。解決問題並解釋它。我非常感激。 –