您好我正在尝试为某种语言创建解析器。
但是当我输出这样的逻辑表达式时,解析器会返回一个错误:X> 5进入if表达式。
例如,如果我发表此声明:if (x>5) a=3;
然后解析器返回错误条件x> 5。
我正在尝试修复问题而没有结果。 我是flex / bison的新手。
任何帮助;
这是flex文件:
`.....
"!" {return NOT;}
"+" | "-" {return MONAD_OPERATOR;}
"*" | "/" | "%" {return DIAD_OPERATOR;}
"==" | "!=" | ">" | "<" | ">=" | "<=" {return SXES_OPERATOR;}
...`
这是野牛档案:
...
if_statement : IF '(' logic_expression ')' statement NEWLINE
| IF '(' logic_expression ')' statement ELSE statement NEWLINE
; ;
logic_expression :
logic_expression sxes_operator logic_expression
| ID
| NUM
| logic_expression diad_operator logic_expression
| '(' logic_expression ')'
| NOT logic_expression
| logic_expression log_operator logic_expression
;
monad_operator : MONAD_OPERATOR ;
diad_operator : DIAD_OPERATOR ;
sxes_operator : SXES_OPERATOR ;
答案 0 :(得分:0)
(评论中回答了这个问题。见Question with no answers, but issue solved in the comments (or extended in chat))
@rici注意到语法有转移 - 减少冲突:
@Grijesh Chauhan总结道:大多数情况下,解析器会做一些合理的事情 转移 - 减少冲突。但它可能不是你所期望的那样, 是的,你应该修复它们。有时你得到意想不到的语法 错误,特别是如果你有减少 - 减少冲突。
语法含糊不清,因此会有冲突。我不知道怎么做 很多,但我怀疑很多。另外,我避免使用不必要的 可以作为终端的非终端(
diad_operator
) (DYAD_OPERATOR
)。这里含糊不清:a < 3 + 4
你的语法允许[[[a] < [3]] + [4]]
和[[a] < [[3] + [4]]]
都作为解析(使用[...]
表示logic_expression
)
在
"!="
,">="
,"<="
之前定义了"!"
,"<"
,">"
的规则。 另外,我更喜欢[]
而不是""