【问题标题】:NoViableAltException when parsing string literals with ANTLR使用 ANTLR 解析字符串文字时出现 NoViableAltException
【发布时间】:2011-10-31 20:44:07
【问题描述】:

我对 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' )? '\'' ( '\'\'' | ~('\'') )* '\''
    ;

它到达“原子”规则,然后给出这个错误:

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

如果我将以下内容添加到“原子”规则中,则字符串会被拾取:

| '\'PUBLIC\''

【问题讨论】:

  • 你如何测试这个?使用 ANTLRWorks 的解释器(或使用 ANTLR IDE Eclipse)?在这种情况下,请使用 ANTLRWorks 的调试器再试一次:它很可能与 string_literal 匹配:ANTLRWorks 的解释器相当有问题,委婉地说。但是,调试器工作得很好。
  • 我在 Eclipse 中使用 ANTLR IDE。感谢您的提示,我将尝试 ANTLRWorks。
  • 没问题。请务必使用调试器(菜单:Run->DebugCTRL+D),不是解释器。

标签: string plsql antlr antlr3 string-literals


【解决方案1】:

我认为您收到此错误是因为其他规则(或缺少规则)。它说它已到达 END 令牌但无法匹配任何规则。例如,您可能在规则的某处遗漏了分号标记。无论如何,理解它需要完整的语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2015-09-24
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多