【发布时间】:2016-02-12 22:34:30
【问题描述】:
自大学以来已经有 20 年了,哈哈,但我终于遇到了对一个简单的迷你解析器的需求。记得学校的 BNF 哈哈,然后是自上而下的递归解析器或类似的东西。因此,我正在尝试在 BNF 中为我的迷你语言建模……一些无意义的示例说明我的目标:
length > 5
(length > 5)
(length > 5) or (length < 2)
((length > 5) and (length < 7)) or length = 0
not (length > 5)
你基本上可以有一个带或不带括号的表达式,用和/或在它们前面加上 not。很明显,某些事情在开头没有意义,比如 or 等等。
到目前为止,我想出了这个:
<syntax> :: <not> <expressionSyntax> | <expressionSyntax>
<not> :: "not"
<expressionSyntax> :: "(" <expression> ")" <expressionRepeatSyntax> | <expression> <expressionRepeatSyntax>
<expressionRepeatSyntax> :: ( <andOr> <expressionSyntax> )*
<andOr> :: "and" | "or"
<expression> :: need to finish this...
syntax 是前导 not 或没有它,expressionSyntax 是带有可选括号的表达式和可选的表达式堆叠。
我在正确的轨道上吗?绝对看起来不正确的一件事是我不能用这种语法堆叠非表达式:
not (length > 5) 和 not (length > 7)
因为在我的第一次通过时,您似乎只能拥有一个不是一开始的。
【问题讨论】:
标签: bnf