expr :: = let ID: TYPE [<- expr] [[, ID: TYPE [<- expr]]] ∗ в expr </p>
Я пытался реализовать это правило в Bison.
Таким образом, expr не является терминалом, в то время как [[, ID: TYPE [<- expr]]] * описывает регулярное выражение, и я подумал, что единственный способ описать это - использовать комбинацию из нескольких правил </p>
express: COMMA ID COL TYPE OSB ASSIGN expr CSB express
;
expr : LET ID COL TYPE OSB ASSIGN expr CSB IN expr
где COL представляет двоеточие (:), OSB и CSB - [и] соответственно, ASSIGN - <-, TYPE - int / char. </p>
Я чувствовал, что добавление производства имеет смысл интуитивно, поскольку оно позволяет мне иметь ноль или более вхождений выражения
[, ID: TYPE [<- expr]]. </strong> Я применил эту логику и к другим правилам. Тем не менее, сейчас у меня куча конфликтов, связанных с сокращением смены, и я вполне уверен, что в этом виноват. Но я не уверен, как это исправить.
Вот код, использующий Бизон и Flex . Грамматика на странице 16 из 30 .