(я использую Yecc, синтаксический анализатор генератор Erlang, похожий на Yacc, так что синтаксис отличается от 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'].
Оба theese похоже на работу, я хотел бы знать, существует ли какая-то разница.
с сепаратором
Я хочу, чтобы соответствовать {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'].
спасибо.
Я не знаю, как написать четкое название для этого на английском языке. Измените его по желанию. – niahoo