大学毕业后大约20岁,LOL,但我终于遇到了一个简单的迷你解析器的需求。从学校哈哈想起BNF,然后是一个自上而下的递归解析器或类似的东西。因此,我试图在BNF中模拟我的迷你语言......一些非常明显的例子,说明了我的目标:
length > 5
(length > 5)
(length > 5) or (length < 2)
((length > 5) and (length < 7)) or length = 0
not (length > 5)
你基本上可以有一个带或不带parantheses的表达式,堆栈&em和/或或者用它们作为前缀。显然,某些事情在一开始就没有意义,等等。
到目前为止,我已经提出了这个问题:
<syntax> :: <not> <expressionSyntax> | <expressionSyntax>
<not> :: "not"
<expressionSyntax> :: "(" <expression> ")" <expressionRepeatSyntax> | <expression> <expressionRepeatSyntax>
<expressionRepeatSyntax> :: ( <andOr> <expressionSyntax> )*
<andOr> :: "and" | "or"
<expression> :: need to finish this...
语法是领导者,没有或没有它,expressionSyntax是具有可选parantheses和可选的表达式堆叠的表达式。
我在这里走在正确的轨道上吗?肯定看起来不对的一件事是我不能用这个语法堆叠表达式:
不是(长度> 5)而不是(长度> 7)
因为看起来你的第一次传球似乎只有一个不在开头。
答案 0 :(得分:0)
我不认为语法可以按照你想要的方式运作。
查看本教程,其中详细介绍了布尔表达式的BNF语法http://compilers.iecc.com/crenshaw/tutor6.txt。第一页的一个例子:
<b-expression>::= <b-term> [<orop> <b-term>]*
<b-term> ::= <not-factor> [AND <not-factor>]*
<not-factor> ::= [NOT] <b-factor>
<b-factor> ::= <b-literal> | <b-variable> | (<b-expression>)
它可能不包含您在剪切和粘贴就绪表单中所需的确切语法,但它应该具有创建它所需的信息。