#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:
Я думаю, вы получаете эту ошибку из-за других правил (или их отсутствия.) В нем говорится, что он дошел до конечного токена, но не смог соответствовать ни одному правилу. Например, вы могли пропустить символ точки с запятой где-то в своих правилах. В любом случае, для его понимания необходима полная грамматика.