简单迷你语言的BNF语法

时间:2015-11-11 18:22:54

标签: bnf

大学毕业后大约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)

因为看起来你的第一次传球似乎只有一个不在开头。

1 个答案:

答案 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>)

它可能不包含您在剪切和粘贴就绪表单中所需的确切语法,但它应该具有创建它所需的信息。