regresion:Antlr C target follow set生成对未声明标识符的引用

时间:2013-02-15 10:27:52

标签: antlr3

ANTLRWorks 1.5rc1成功生成了此语法的C目标代码,没有任何警告或错误,但C目标代码无法编译。

ANTLRWorks 1.5生成了相同的错误C目标代码,但控制台列出了许多模板错误。

ANTLRWorks 1.4.3生成了无错误编译的有效C目标代码。

error C2065: 'FOLLOW_set_in_sqlCOMP_OP2185' : undeclared identifier

从多个布尔表达式规则

引用了规则sqlCOMP_OP

生成对未定义标识符的引用的所有规则都是以下形式:

fule: (Tokena | Tokenb | Tokenc)? Tokend;

或者有多个对共同规则的引用:

fule: (Tokena | Tokenb | Tokenc);

在第一种情况下,我能够将规则转换为逻辑上等效的形式,但不会生成对未定义标识符的引用:

fule: (Tokena Tokend | Tokenb Tokend | Tokenc Tokend | Tokend);

在第二种情况下,不可能进行转换。相反,唯一的解决方法是将失败规则的主体替换为每个引用。

sqlCONDITION    :  
    sqlLOGICAL_EXPRESSION
    ;

sqlLOGICAL_EXPRESSION    :  
    sqlLOGICAL_TERM (STOK_OP_OR sqlLOGICAL_TERM)*
    ;

sqlLOGICAL_TERM        :
    sqlLOGICAL_FACTOR (STOK_OP_AND sqlLOGICAL_FACTOR)*
    ;

sqlLOGICAL_FACTOR        :
    (STOK_NOT) => STOK_NOT
    (    sqlUNTYPED_BOOLEAN_PRIMARY
    |    sqlNUMERIC_BOOLEAN_PRIMARY
    |    sqlSTRING_BOOLEAN_PRIMARY
    |    sqlCLOB_BOOLEAN_PRIMARY
    |    sqlDATE_BOOLEAN_PRIMARY
    |    sqlDATETIME_BOOLEAN_PRIMARY
    |    STOK_OPEN_PAREN    
        sqlCONDITION    
        STOK_CLOSE_PAREN
    )
    ;

sqlUNTYPED_BOOLEAN_PRIMARY    :
    (    STOK_EXISTS             sqlSUB_QUERY
    |    STOK_NOT STOK_EXISTS     sqlSUB_QUERY
    |    sqlIS_OR_ISNOT_CLAUSE    
        STOK_IN STOK_ROWSET     STOK_IDENTIFIER
    )
    ;

sqlCOMP_OP    :
    (    STOK_OP_EQ
    |    STOK_OP_NE
    |    STOK_OP_GE
    |    STOK_OP_GT
    |    STOK_OP_LE
    |    STOK_OP_LT
    )
    ;

sqlIS_OR_ISNOT_CLAUSE        :
    (    STOK_IS            STOK_NOT?
    |    STOK_NOT
    )
    ;

sqlNUMERIC_BOOLEAN_PRIMARY    :
    (    sqlNUMERIC_EXPRESSION        
        (    sqlCOMP_OP        
            sqlNUMERIC_EXPRESSION

        |    sqlNUMERIC_BOOLEAN_PREDICATE
        )

    |    sqlNUMERIC_COLUMN_LIST 
        sqlNUMERIC_BOOLEAN_PREDICATE
    )
    ;

sqlNUMERIC_BOOLEAN_PREDICATE:
    (    sqlIS_OR_ISNOT_CLAUSE?
        (    STOK_IN            sqlNUMERIC_SET
        |    STOK_BETWEEN    sqlNUMERIC_EXPRESSION STOK_OP_AND sqlNUMERIC_EXPRESSION
        )
    |    sqlIS_OR_ISNOT_CLAUSE
        STOK_SQL_NULL
    )
    ;    

sqlSTRING_BOOLEAN_PRIMARY    :
    (    sqlSTRING_EXPRESSION
        (    sqlCOMP_OP        
            sqlSTRING_EXPRESSION

        |    sqlSTRING_BOOLEAN_PREDICATE
        )

    |    sqlSTRING_COLUMN_LIST
        sqlSTRING_BOOLEAN_PREDICATE
    )    
    ;

sqlSTRING_BOOLEAN_PREDICATE    :
    (    sqlIS_OR_ISNOT_CLAUSE?
        (    STOK_IN            sqlSTRING_SET
        |    STOK_LIKE        sqlSTRING
        |    STOK_BETWEEN    sqlSTRING_EXPRESSION STOK_OP_AND sqlSTRING_EXPRESSION
        )
    |    sqlIS_OR_ISNOT_CLAUSE
        STOK_SQL_NULL
    )
    ;

sqlCLOB_BOOLEAN_PRIMARY    :
    (    STOK_NOT?
        STOK_CONTAINS
        STOK_OPEN_PAREN
        sqlCLOB_COLUMN_VALUE
        STOK_COMMA
        sqlSTRING
        STOK_CLOSE_PAREN

    |    sqlCLOB_COLUMN_VALUE
        sqlIS_OR_ISNOT_CLAUSE
        STOK_SQL_NULL
    )    
    ;

sqlDATE_BOOLEAN_PRIMARY    :
    (    sqlDATE_EXPRESSION        
        (    sqlCOMP_OP        
            sqlDATE_EXPRESSION

        |    sqlDATE_BOOLEAN_PREDICATE
        )

    |    sqlDATE_COLUMN_LIST
        sqlDATE_BOOLEAN_PREDICATE
    )    
    ;

sqlDATE_BOOLEAN_PREDICATE    :
    (    sqlIS_OR_ISNOT_CLAUSE?
        (    STOK_IN            sqlDATE_SET
        |    STOK_BETWEEN    sqlDATE_EXPRESSION STOK_OP_AND sqlDATE_EXPRESSION
        )
    |    sqlIS_OR_ISNOT_CLAUSE
        STOK_SQL_NULL
    )
    ;

sqlDATETIME_BOOLEAN_PRIMARY    :
    (    sqlDATETIME_EXPRESSION        
        (    sqlCOMP_OP        
            sqlDATETIME_EXPRESSION

        |    sqlDATETIME_BOOLEAN_PREDICATE
        )

    |    sqlDATETIME_COLUMN_LIST
        sqlDATETIME_BOOLEAN_PREDICATE
    )    
    ;

sqlDATETIME_BOOLEAN_PREDICATE    :
    (    sqlIS_OR_ISNOT_CLAUSE?
        (    STOK_IN            sqlDATETIME_SET
        |    STOK_BETWEEN    sqlDATETIME_EXPRESSION STOK_OP_AND sqlDATETIME_EXPRESSION
        )
    |    sqlIS_OR_ISNOT_CLAUSE
        STOK_SQL_NULL
    )
    ;

1 个答案:

答案 0 :(得分:1)

我遇到了与此类规则相同的问题:

prio14Operator: '=' | '+=' | '-=' | '*=' | '/=' | '%=' | '<<=' | '>>=' | '&=' | '|=' | '^=' | 'is';
prio14Expression: prio13Expression (prio14Operator prio13Expression)*;  

将规则重写为此格式解决了问题:

prio14Expression: prio13Expression (('=' | '+=' | '-=' | '*=' | '/=' | '%=' | '<<=' | '>>=' | '&=' | '|=' | '^=' | 'is') prio13Expression)*;