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

2 番目のケースでは、変換はできません。代わりに、唯一の修正は、失敗したルールの本文をすべての参照に逆代入することです。

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