Почему мое правило грамматики вызывает ошибку только потому, что я изменил регистр имени правила? - PullRequest
0 голосов
/ 09 января 2020

Я скопировал грамматику antlr4 json отсюда: грамматика json

, и я изменил некоторое правило и код, как показано ниже:

grammar PyJson;

my_rule
   : STRING
   ;

waha
   : STRING
   | INT
   ;

STRING
   : '"' (ESC | SAFECODEPOINT)* '"'
   ;
fragment ESC
   : '\\' (["\\/bfnrt] | UNICODE)
   ;

fragment UNICODE
   : 'u' HEX HEX HEX HEX
   ;

fragment HEX
   : [0-9a-fA-F]
   ;

fragment SAFECODEPOINT
   : ~ ["\\\u0000-\u001F]
   ;

fragment INT
   : '0' | [1-9] [0-9]*
   ;

WS
   : [ \t\n\r] + -> skip
   ;

Я использую my_rule для тестирования "helloWorld", и он работает хорошо. Но если изменить правило «ваха» на «ВАХА», оно выдаст ошибку.

[@0,0:11='"helloWorld"',<WAHA>,1:0]
[@1,20:19='<EOF>',<EOF>,5:0]
line 1:0 mismatched input '"helloWorld"' expecting STRING

почему правило грамматики запускает ошибку только потому, что я изменяю регистр правила? не могли бы вы мне помочь, пожалуйста? спасибо!

1 Ответ

3 голосов
/ 09 января 2020

Имена правил, начинающиеся с заглавной буквы, автоматически считаются правилами лексера, в противном случае они являются правилами синтаксического анализатора. С вашим изменением вы преобразовали waha в правило лексера с собственным типом токена (<WAHA>). Это не тот тип STRING, которого ожидает my_rule, следовательно, синтаксическая ошибка.

...