题目说明:
代码生成
为语言的语法规则定义代码生成,以支持加法和减法。
您可以使用在前面级别中定义的堆栈操作(如ADD和SUB)。
代码生成模板通常需要包含规则中其他符号的代码。
这些可以通过方括号中的符号名称插入。
例如,规则:
Expression → Expression + Number
可以有以下代码模板:
[Expression]
PUSH_VALUE [Number]
ADD
像[Number]这样的标记名称将被实际标记值替换。
像[Expression]这样的非终端将被该规则的模板替换
(以及递归地进行下去)。
Syntax rules 语法规则
指定用于语法节点生成的汇编代码。
代码可以包含汇编指令或宏指令,
并且可以嵌入规则中其他符号生成的代码。
通过用方括号括起名称来插入符号的代码,例如[Expression]。
结果如下:
以上是最少的符号识别范围,
其中第一个[ ]+ 是指任意个空格都忽略
第二个[0-9]+是多个数字形成Number
只有前面两个是pattern模式匹配,与正则表达式语法一致。
后面的四个,+ - ( ) 是精确匹配,都是字符(literal)
上图是Syntax rules 语法规则的答案,
需要注意的是,右边黑色框内的asm内容也要手填,前面的只是示例,后面加的,不会自己生成asm
这部分的意思是,左边的语法规则,转换为右边的asm。
错误时,提示右手边(on the right-hand side)的内容,不是指箭头的右手边,而是指黑色部分(整个语法表达式的右手边)。