Я работаю над проектом, и мне нужно создать парсер для следующей грамматики:
grammar T;
Я пытаюсь прочитать этот фрагмент кода:
theory oo
begin
builtins: asymmetric-encryption
functions: f/1 // f/1 used for function in protocol
/* Channel rules */
rule ChanOut_S:
[Out_S($A,$B,xn,x)]
--[ChanOut_S($A,$B,xn,x)]->
[!Sec($A,$B,xn,x)]
Я использовал для генерации дерева парсера с помощью grun следующим образом:
grun T теория oo.spthy -gui
Но каждый раз, когда я пытаюсь сгенерировать дерево парсера, я получаю следующую ошибку:
line 9:5 no viable alternative at input 'ruleC'
Кажется, с грамматикой возникла проблема, но я не могу ее понять. У тебя есть какие-нибудь подсказки?
@BartKiers Это на линии rule ChanOut_S:
.
Парсер должен использовать правило protoRule: 'rule' identifier ':' genericRule, но по какой-то причине не может туда перейти.
Ах, пробел не отображается ошибкой ANTLR.
Похоже, лексер запутался в этих двух правилах:
ALPHA : 'A'..'Z';
ALPH : ('a'..'z' | 'A'..'Z');
Поскольку первая буква ChanOut_S
соответствует правилу ALPHA, C используется этим правилом лексического анализатора. Если вы измените порядок этих двух правил, распознается весь идентификатор.
ALPH : ('a'..'z' | 'A'..'Z');
ALPHA : 'A'..'Z';
Да, работает !! Спасибо! Но знайте, что синтаксический анализ не может прочитать Out_S ($ A, $ B, xn, x), что дает следующую ошибку: несоответствующий ввод 'O', ожидающий {'!', ALPHA}! Почему?
@ user1319267 Похоже, Out_S($A,$B,xn,x)
не соответствует ни одному из определений для fact
.
Правда! Отсутствовал factIdentifier '(' msetterm (',' msetterm) * ')'
Хорошо, я исправил грамматику, но проблема не исчезла! собственно говоря, у меня такая же ошибка! Если я вижу дерево синтаксического анализатора, он видит, что существует genericRule, видит факты, но при первом факте не может прочитать Out_S ($ A, $ B, xn, x), даже если теперь существует правило.
@ user1319267 Я не уверен, что это вызвало, но думаю, что это может быть $
. Я вижу их только как часть определения nonnode_var
и нигде не вижу в них как компонента msetterm
.
Я не вижу
ruleC
во входных данных, которые вы разбираете.