[英]How do I add operator precedence to a lark grammar for FOL with Equality?
我如何修改此語法以匹配更遠的括號?
?wff: compound_wff
?compound_wff: biconditional_wff
?biconditional_wff: conditional_wff (SPACE? BICONDITIONAL_SYMBOL SPACE? biconditional_wff)*
?conditional_wff: disjunctive_wff (SPACE? CONDITIONAL_SYMBOL SPACE? conditional_wff)*
?disjunctive_wff: conjunctive_wff (SPACE? DISJUNCTION_SYMBOL SPACE? disjunctive_wff)*
?conjunctive_wff: negated_wff (SPACE? CONJUNCTION_SYMBOL SPACE? conjunctive_wff)*
?negated_wff: (NEGATION_SYMBOL SPACE)* atomic_wff
?atomic_wff: predicate
| term EQUAL_TO term
| quantified_wff* LEFT_PARENTHESIS SPACE? wff SPACE? RIGHT_PARENTHESIS
?term: function
| NAME
| VARIABLE
?predicate: PREDICATE_NAME [LEFT_PARENTHESIS term (COMMA term)* RIGHT_PARENTHESIS]
?function: FUNCTION_NAME LEFT_PARENTHESIS term (COMMA SPACE? term)* RIGHT_PARENTHESIS
?quantified_wff: curly_quantifiers | quantifiers
?curly_quantifiers: quantifier_symbol LEFT_CURLY_BRACE VARIABLE (COMMA SPACE? VARIABLE)* RIGHT_CURLY_BRACE SPACE?
?quantifiers: quantifier_symbol SPACE? VARIABLE (COMMA SPACE? VARIABLE)* SPACE?
SPACE: /\s+/
COMMA: ","
EQUAL_TO: "="
LEFT_PARENTHESIS: "("
RIGHT_PARENTHESIS: ")"
LEFT_CURLY_BRACE: "{"
RIGHT_CURLY_BRACE: "}"
quantifier_symbol: UNIVERSAL_QUANTIFIER_SYMBOL | EXISTENTIAL_QUANTIFIER_SYMBOL
UNIVERSAL_QUANTIFIER_SYMBOL: "\\forall" | "∀"
EXISTENTIAL_QUANTIFIER_SYMBOL: "\\exists" | "∃"
NAME: /[a-t]/ | /[a-t]_[1-9]\d*/
VARIABLE: /[u-z]/ | /[u-z]_[1-9]\d*/
PREDICATE_NAME: /[A-HJ-Z]/ | /[A-HJ-Z]_[1-9]\d*/
FUNCTION_NAME: /[a-z]/ | /[a-z]_[1-9]\d*/
NEGATION_SYMBOL: "\\neg" | "\\lnot" | "¬"
CONJUNCTION_SYMBOL: "\\wedge" | "\\land" | "∧"
DISJUNCTION_SYMBOL: "\\vee" | "\\lor" | "∨"
CONDITIONAL_SYMBOL: "\\rightarrow" | "\\Rightarrow" | "\\Longrightarrow" | "\\implies" | "→" | "⇒"
BICONDITIONAL_SYMBOL: "\\leftrightarrow" | "\\iff" | "↔" | "⇔"
我正在嘗試使用我的語法來解析它:
其中 LaTeX 是:
\exists{x} \forall{y} (P(f(x, y)) \vee \forall{z}(V(z) \iff \neg R(a) \wedge B(a)))
我遵循了計算器示例並修改了我的原始語法以添加導致此結果的運算符優先級。 但它不再接受輸入字符串。
我收到此錯誤:
lark.exceptions.UnexpectedCharacters: No terminal matches '\' in the current parser context, at line 1 col 35
\exists{x} \forall{y} (P(f(x, y)) \vee \forall{z}(V(z) \iff \neg R(a) \wed
^
Expected one of:
* RIGHT_PARENTHESIS
理想情況下,我想盡可能強制要求括號,除非在沒有括號的否定atomic_wff
前面。 這是為了確保即使在明確的歧義設置下也只生成一個解析樹。 我該如何解決這個問題?
我想澄清的是,相同運算符的運算符優先級應該是右結合的。 所以P(a) ∧ Q(a) ∧ R(a)
將解析為P(a) ∧ (Q(a) ∧ R(a))
我已經使百靈鳥語法更容易使用適當的終端進行調試。 它現在解析長 latex 方程,但對於更簡單的輸入仍然是模棱兩可的,例如P(a) ∧ Q(a) ∧ R(a)
會生成兩個解析樹。 我仍然不知道我做錯了什么。 語法正在執行正確的遞歸,但仍然無法生成單個解析樹。
我最近嘗試的解決方案在每種情況下都有效,除了給予否定更高的優先級。 任何的想法?
?wff: compound_wff
compound_wff: biconditional_wff
biconditional_wff: conditional_wff (SPACE? BICONDITIONAL_SYMBOL SPACE? conditional_wff)*
conditional_wff: disjunctive_wff (SPACE? CONDITIONAL_SYMBOL SPACE? disjunctive_wff)*
disjunctive_wff: conjunctive_wff (SPACE? DISJUNCTION_SYMBOL SPACE? conjunctive_wff)*
conjunctive_wff: negated_wff (SPACE? CONJUNCTION_SYMBOL SPACE? negated_wff)*
negated_wff: (NEGATION_SYMBOL SPACE?)* atomic_wff
atomic_wff: predicate
| term EQUAL_TO term
| quantified_wff* LEFT_PARENTHESIS SPACE? wff SPACE? RIGHT_PARENTHESIS
term: function
| NAME
| VARIABLE
predicate: PREDICATE_NAME [LEFT_PARENTHESIS term (COMMA term)* RIGHT_PARENTHESIS]
function: FUNCTION_NAME LEFT_PARENTHESIS term (COMMA term)* RIGHT_PARENTHESIS
quantified_wff: curly_quantifiers | quantifiers
curly_quantifiers: quantifier_symbol LEFT_CURLY_BRACE VARIABLE (COMMA SPACE? VARIABLE)* RIGHT_CURLY_BRACE SPACE?
quantifiers: quantifier_symbol SPACE? VARIABLE (COMMA SPACE? VARIABLE)* SPACE?
SPACE: /\s+/
COMMA: /,\s*/
EQUAL_TO: /\s*=\s*/
LEFT_PARENTHESIS: "("
RIGHT_PARENTHESIS: ")"
LEFT_CURLY_BRACE: "{"
RIGHT_CURLY_BRACE: "}"
quantifier_symbol: UNIVERSAL_QUANTIFIER_SYMBOL | EXISTENTIAL_QUANTIFIER_SYMBOL
UNIVERSAL_QUANTIFIER_SYMBOL: "\\forall" | "∀"
EXISTENTIAL_QUANTIFIER_SYMBOL: "\\exists" | "∃"
NAME: /[a-t]/ | /[a-t]_[1-9]\d*/
VARIABLE: /[u-z]/ | /[u-z]_[1-9]\d*/
PREDICATE_NAME: /[A-HJ-Z]/ | /[A-HJ-Z]_[1-9]\d*/
FUNCTION_NAME: /[a-z]/ | /[a-z]_[1-9]\d*/
NEGATION_SYMBOL: "\\neg" | "\\lnot" | "¬"
CONJUNCTION_SYMBOL: "\\wedge" | "\\land" | "∧"
DISJUNCTION_SYMBOL: "\\vee" | "\\lor" | "∨"
CONDITIONAL_SYMBOL: "\\rightarrow" | "\\Rightarrow" | "\\Longrightarrow" | "\\implies" | "→" | "⇒"
BICONDITIONAL_SYMBOL: "\\leftrightarrow" | "\\iff" | "↔" | "⇔"
%ignore SPACE
%ignore COMMA
%ignore LEFT_CURLY_BRACE
%ignore RIGHT_CURLY_BRACE
因此它無法為¬P(a) ∧ Q(b)
生成單個解析樹。
問題是每個 wff 規則與其部分的先行規則不匹配。 所以:
?biconditional_wff: conditional_wff (SPACE? BICONDITIONAL_SYMBOL SPACE? biconditional_wff)*
應改為:
?biconditional_wff: conditional_wff (SPACE? BICONDITIONAL_SYMBOL SPACE? conditional_wff)*
這個問題的解決方案是使用這樣的語法:
?wff: compound_wff
compound_wff: biconditional_wff
biconditional_wff: conditional_wff (SPACE? BICONDITIONAL_SYMBOL SPACE? conditional_wff)*
conditional_wff: disjunctive_wff (SPACE? CONDITIONAL_SYMBOL SPACE? disjunctive_wff)*
disjunctive_wff: conjunctive_wff (SPACE? DISJUNCTION_SYMBOL SPACE? conjunctive_wff)*
conjunctive_wff: negated_wff (SPACE? CONJUNCTION_SYMBOL SPACE? negated_wff)*
negated_wff: (NEGATION_SYMBOL SPACE?)* atomic_wff
atomic_wff: predicate
| term EQUAL_TO term
| quantified_wff* LEFT_PARENTHESIS SPACE? wff SPACE? RIGHT_PARENTHESIS
term: function
| NAME
| VARIABLE
predicate: PREDICATE_NAME [LEFT_PARENTHESIS term (COMMA term)* RIGHT_PARENTHESIS]
function: FUNCTION_NAME LEFT_PARENTHESIS term (COMMA term)* RIGHT_PARENTHESIS
quantified_wff: curly_quantifiers | quantifiers
curly_quantifiers: quantifier_symbol LEFT_CURLY_BRACE VARIABLE (COMMA SPACE? VARIABLE)* RIGHT_CURLY_BRACE SPACE?
quantifiers: quantifier_symbol SPACE? VARIABLE (COMMA SPACE? VARIABLE)* SPACE?
SPACE: /\s+/
COMMA: /,\s*/
EQUAL_TO: /\s*=\s*/
LEFT_PARENTHESIS: "("
RIGHT_PARENTHESIS: ")"
LEFT_CURLY_BRACE: "{"
RIGHT_CURLY_BRACE: "}"
quantifier_symbol: UNIVERSAL_QUANTIFIER_SYMBOL | EXISTENTIAL_QUANTIFIER_SYMBOL
UNIVERSAL_QUANTIFIER_SYMBOL: "\\forall" | "∀"
EXISTENTIAL_QUANTIFIER_SYMBOL: "\\exists" | "∃"
NAME: /[a-t]/ | /[a-t]_[1-9]\d*/
VARIABLE: /[u-z]/ | /[u-z]_[1-9]\d*/
PREDICATE_NAME: /[A-HJ-Z]/ | /[A-HJ-Z]_[1-9]\d*/
FUNCTION_NAME: /[a-z]/ | /[a-z]_[1-9]\d*/
NEGATION_SYMBOL: "\\neg" | "\\lnot" | "¬"
CONJUNCTION_SYMBOL: "\\wedge" | "\\land" | "∧"
DISJUNCTION_SYMBOL: "\\vee" | "\\lor" | "∨"
CONDITIONAL_SYMBOL: "\\rightarrow" | "\\Rightarrow" | "\\Longrightarrow" | "\\implies" | "→" | "⇒"
BICONDITIONAL_SYMBOL: "\\leftrightarrow" | "\\iff" | "↔" | "⇔"
同時刪除%ignore
指令。
%ignore SPACE
%ignore COMMA
%ignore LEFT_CURLY_BRACE
%ignore RIGHT_CURLY_BRACE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.