题目说明:
语法定义涉及数字、括号和运算符+和-的表达式的语法。起始符号为Expression。一个表达式应该对应于以下之一:一个数字标记Expression + ExpressionExpression - Expression- Expression( Expression )
level help
通过语法来描述高级语言的语法。语法是一组规则,其中每个规则命名语法的一部分,
并定义了它如何组成。例如,这是一个非常简单的语法,
用于允许两个数字相加,如“2 + 2”:Expression → Number + Number
Number和+是在标记定义阶段定义的标记。
此语法将允许任意两个数字的加法,
但不会允许多次加法,如2 + 3 + 4。
为了支持任意多次加法,我们使用引用自身的规则:Program → Expression
Expression → Expression + Number
Expression → Number
此语法将允许无限次加法,
因为+左边的Expression本身可以是加法。**术语**
语法中使用的术语称为符号。
规则定义了一个符号(箭头左侧)
由一个或多个其他符号(箭头右侧)组成。
箭头右侧的符号要么是通过标记规范(在前一步中定义)
定义的标记,
要么是由同一语法中的规则定义的符号本身。代表标记的符号(如Number和+)称为终结符,
像Program和Expression这样由语法中
其他规则定义的符号称为非终结符。用作非终结符号的名称是任意的 - 您可以使用对您有意义的名称。
唯一的条件是必须有一个“起始符号”称为Program,
它表示整个程序。**解析算法**
在这个级别上,我们不编写实际的解析器,
该解析器根据语法规则处理源文本并生成语法树。
解析器算法是计算机科学的一个整个分支,
超出了本游戏的范围。
也就是说,最简单的解析器形式,
递归下降解析器易于编写,并且对于大多数目的而言已经足够了。
如果您想探索编写自己的解析器,这是一个很好的起点。本游戏使用Earley解析器,它不是最快的解析器,
但它灵活且易于编写语法。
Grammar 语法规则
Specify the rules for parsing the token into a syntax tree.
On the left is the name of a production.
On the right is one or more names of productions or tokens
指定将标记解析为语法树的规则。
左侧是产生式的名称。
右侧是一个或多个产生式或标记的名称。
The syntax tree of the source code parsed by the grammar.
源代码由语法解析生成的语法树。
最终题目期望的答案如下:
需要注意的是:
Expression 与 符号 之间,记得加空格。
根据错误提示:
Error when parsing ‘8 + (-4)’. Parse error: Unexpected ‘(’
把 Expression + ( - Expression ) 穷举出来。