GOLD парсер создатель и терминалы
Я пытаюсь создать грамматику для языка сценариев, используя конструктор синтаксического анализатора GOLD, так как я хочу вывод в C#. Однако парсер явно хочет, чтобы терминалы были уникальными. Однако значение терминала может быть контекстно-зависимым?! Рассмотрим символ "-". И то и другое -x
а также x-y
допустимы, и можно написать грамматику следующим образом:
! -------------------------------------------------
! Terminals
! -------------------------------------------------
Opers = [+-*/]
! -------------------------------------------------
! Rules
! -------------------------------------------------
<Expression> ::= <Expression> <Operator> <Expression>
| '-' <Expression>
| <Value>
<Operator> ::= Opers
Однако теперь символ '-' определяется дважды, один раз косвенно (!) Определенным символом во 2-м производственном правиле <Expression>
и один раз как терминал (определенный Оперсом).
Кроме того, строка может содержать также символ -, добавляя третье определение "-"!? Как вы обходите это? Я не видел никакой информации об этом в документации GOLD или где-либо в Интернете. Я думаю, что есть какой-то основной способ работы со сборщиками Parser, которого я не знаю.
Если это проблема, которую невозможно решить с помощью анализатора на основе таблиц, какие у меня есть альтернативы, так как я хочу вывод C#?
1 ответ
Ошибка в том, что -< EXPRESSION>
находится в конфликте с оператором, поставьте минус в значение примерно так:
< value> ::= int|'-'< value>