Исключение NoViableAltException при разборе строковых литералов с помощью ANTLR

#string #plsql #antlr #antlr3 #string-literals

#строка #plsql #антлр #antlr3 #строковые литералы

Вопрос:

Я очень новичок в ANTLR, пытаюсь разобрать простую функцию PL / SQL. Приношу свои извинения, если это глупый вопрос.

 function MyFunc return boolean is 
begin

    IF :USER_ID_P IS NULL THEN
        :USER_ID_P := 'PUBLIC'; 
    END IF;
return (TRUE);
end;
 

Грамматический отрывок, который должен его уловить:

 atom
: variable_or_function_call ( PERCENT attribute )?
    | SQL PERCENT attribute
    | string_literal
    | numeric_atom
    | boolean_atom
    | NULL
    | LPAREN expression RPAREN
    ;


string_literal
    : QUOTED_STRING
    ;

QUOTED_STRING
    :    ( 'n' )? ''' ( '''' | ~(''') )* '''
    ;
 

Он переходит к правилу «atom», а затем выдает эту ошибку:

 NoViableAltException: line 6:0 no viable alternative for input 'END'
 

Строка будет выбрана, если я добавлю следующее к правилу «atom»:

 | ''PUBLIC''
 

Комментарии:

1. Как вы это тестируете? С помощью интерпретатора ANTLRWorks (или с помощью ANTLR IDE Eclipse)? В таком случае попробуйте еще раз с помощью отладчика ANTLRWorks: скорее всего, он совпадает string_literal : интерпретатор из ANTLRWorks, мягко говоря, довольно глючный. Однако отладчик работает отлично.

2. Я использую среду IDE ANTLR в Eclipse. Спасибо за совет, я попробую ANTLRWorks.

3. Нет проблем. Обязательно используйте отладчик (меню: Run->Debug , или CTRL D ), а не интерпретатор.

Ответ №1:

Я думаю, вы получаете эту ошибку из-за других правил (или их отсутствия.) В нем говорится, что он дошел до конечного токена, но не смог соответствовать ни одному правилу. Например, вы могли пропустить символ точки с запятой где-то в своих правилах. В любом случае, для его понимания необходима полная грамматика.