2

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
    )
    ;
4

1 回答 1

1

我对这种类型的规则有同样的问题:

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

将规则重写为这种格式解决了这个问题:

prio14Expression: prio13Expression (('=' | '+=' | '-=' | '*=' | '/=' | '%=' | '<<=' | '>>=' | '&=' | '|=' | '^=' | 'is') prio13Expression)*;    
于 2013-11-11T12:17:32.647 回答