2012-03-29 59 views
4

我为非常简单的规则语言创建了一个正式的规范,非常简单。 我想使用EBNF,因为这是一个标准,但我不知道如何指定操作的顺序。这是目前的规格。Extended Backus-Naur表单操作顺序

rule = statement, { (‘AND’|’OR’), statement}; 

variable = ‘$’,alphabetic character, {alphabetic character | digit}; 

statement = variable, [ ‘count’,[white space ],’>’,[white space],number ]; 

alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G" 
        | "H" | "I" | "J" | "K" | "L" | "M" | "N" 
        | "O" | "P" | "Q" | "R" | "S" | "T" | "U" 
        | "V" | "W" | "X" | "Y" | "Z" ; 

number = [ "-" ] , digit , { digit } ; 

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; 

white space = ? white space characters ? ; 

我的问题是如何显示括号中的内容应该先评估。 因此,像这样

$strap AND ($greenSticker count > 5 OR ($greenSticker AND $redSticker)) 

这似乎是一个共同的特点,以大多数语言,但我的谷歌技能没有我,我似乎无法找到一个例子。

回答

11

鉴于这种作为简化示例LL语法:

expression -> (+|-|ε) term ((+|-) term)* 
term -> factor ((*|/) factor)* 
factor -> var | number | (expression) 

正如你可以看到,具有较低优先级(+-)的运营商在比优先级高运营商的更一般规则(*/ )。这完全是关于生成正确的分析树。但根据经验,“外部”或更一般的规则具有较低的优先级,这就是加法和减法运算符放在term旁边的原因,因为term必须进一步派生。如果你看看更复杂的语法,你会发现这被认为是极端的,具有适当的优先级。

+1

在表达语法规则的优先顺序时,我看不出为什么要区分自上而下和自下而上的解析。正如你所说的,这完全是关于生成正确的分析树,而你只是构建自顶向下或自底向上,最终达到相同的结果。当然这有一些含义,但对于我来说,如何将解析技术与这种优先级相关联并不明显。请解释。 – Gunther 2012-03-30 08:42:47

+1

该表达式语法也可以在自下而上的解析器中工作,也可以在自上而下的LL解析器中工作,而不仅仅用于递归下降解析器。普拉特解析器也是递归下降和自上而下的。你的第二段对我来说确实没有任何意义。 – EJP 2012-04-05 01:26:57

+0

为了解决您的两个问题,我刚刚删除了令人困惑的段落。我希望我的答案的其余部分是有益的! – 2012-04-05 02:31:43