1

我正在根据我的语法从 AST 树中打印出类型字段和文本字段,我得到了这个

type=5 text=and
    type=14 text==
        type=4 text=ALIAS
            type=20 text=a
        type=7 text=ATTR_NAME
            type=20 text=column_b
        type=36 text=STR_VAL
            type=35 text="asdfds"
    type=14 text==
        type=4 text=ALIAS
            type=20 text=a
        type=7 text=ATTR_NAME
            type=20 text=yyyy
        type=12 text=DEC_VAL
            type=11 text=564.555

我生成的词法分析器中的有效类型整数是

public static final int EOF=-1;
public static final int ALIAS=4;
public static final int AND=5;
public static final int ATTR_NAME=7;
public static final int DECIMAL=11;
public static final int DEC_VAL=12;
public static final int EQ=14;
public static final int ID=20;
public static final int STR_VAL=36;

我非常希望树中永远不要有 type=20 !!!而是将类型为 20 的节点上移一级,因此文本将是信息(不是令牌名称),类型将是 4,7,或 ALIAS 或 ATTR_NAME 类型。有没有办法做到这一点?

我当前语法的这一部分现在使用虚构的标记 ATTR_NAME 和 ALIAS

primaryExpr
    :   compExpr
    |   inExpr
    |   parameterExpr
    |   attribute
    ;

parameterExpr
    :   attribute (EQ | NE | GT | LT | GE | LE)^ parameter
    |   aliasdAttribute (EQ | NE | GT | LT | GE | LE)^parameter
    ;

compExpr
    :   attribute (EQ | NE | GT | LT | GE | LE)^ value
    |     aliasdAttribute(EQ | NE | GT | LT | GE | LE)^value
    ;
alias
    :   ID
    ;
inExpr  :   attribute IN^ valueList
    ;

attribute: ID -> ^(ATTR_NAME ID);

aliasdAttribute
    :       alias(DOT)(ID) -> ^(ALIAS alias ) ^(ATTR_NAME ID)
    ;
4

1 回答 1

1

有没有办法做到这一点?

当然。

alias语法T规则:

grammar T;

options {
  output=AST;
}

tokens {
  ALIAS;
}

alias
 : ID -> ALIAS[$ID.text]
 ;

ID : ('a'..'z' | 'A'..'Z')+;

将始终生成(重写)类型ALIAS为的标记,但内部文本与ID标记相同。

于 2012-07-06T19:00:57.680 回答