(我用的是Yecc,一个类似Yacc的Erlang解析器生成器,所以语法和Yacc不一样)
问题很简单,假设我们想要解析一个 lispy 语法,我想要匹配表达式列表。表达式列表是用空格分隔的表达式列表。
在 Erlang 中,[1,3,4]
是一个列表并++
连接两个列表。
我们想要匹配这个1 (1+2) 3
。expression
将匹配 1、(1+2) 和 3。因此,我在列表中匹配,然后再匹配一个表达式,如果没有匹配,我结束匹配单个表达式。这会递归地构建一个列表。
expressionlist -> expressionlist expression : '$1' ++ ['$2'].
expressionlist -> expression : ['$1'].
但我也可以这样做(颠倒顺序):
expressionlist -> expression expressionlist : ['$1'] ++ '$2'.
expressionlist -> expression : ['$1'].
这两个似乎都有效,我想知道是否有任何区别。
带分隔符
我想匹配{name = albert , age = 43}
。propdef
匹配name = value
。所以这是同样的问题,但有一个额外的分隔符,
。与第一个问题有什么区别吗?
proplist -> propdef ',' proplist : ['$1'] ++ '$3'.
proplist -> propdef : ['$1'].
proplist -> '{' proplist '}' : '$2'.
proplist -> '{' '}' : [].
%% Could write this
%% proplist -> proplist ',' propdef : '$1' ++ ['$3'].
谢谢你。