Java 编写ANTLR 4.8侦听器
我有一个ANTLR语法文件:Java 编写ANTLR 4.8侦听器,java,antlr4,Java,Antlr4,我有一个ANTLR语法文件: grammar Cql; parse : ( cql_stmt_list )* EOF ; cql_stmt_list : SCOL* cql_stmt ( SCOL+ cql_stmt )* SCOL* ; cql_stmt : OPEN_PAR* expr ( ( K_AND | K_OR) OPEN_PAR* expr CLOSE_PAR* )* CLOSE_PAR* ordering_term? ; expr : K_NOT* (
grammar Cql;
parse
: ( cql_stmt_list )* EOF
;
cql_stmt_list
: SCOL* cql_stmt ( SCOL+ cql_stmt )* SCOL*
;
cql_stmt
: OPEN_PAR* expr ( ( K_AND | K_OR) OPEN_PAR* expr CLOSE_PAR* )* CLOSE_PAR* ordering_term?
;
expr
: K_NOT* ( field | literal_value ) operator OPEN_PAR* ( literal_value | literal_list | FUNCTION | dates ) (compare_dates)? CLOSE_PAR*
;
ordering_term
: K_ORDER K_BY literal_value ( K_ASC | K_DESC )? (COMMA literal_value ( K_ASC | K_DESC )? )*
;
operator
: EQ
| NOT_EQ
| CONTAINS
| NOT_CONTAINS
| LT_EQ
| LT
| GT
| GT_EQ
| K_IN
| K_NOT K_IN
| K_IS
| K_WAS
| K_IS K_NOT
| K_WAS K_NOT
| K_CHANGED K_TO
;
literal_value
: STRING_LITERAL
| IDENTIFIER
| state_name
| field
| dates
;
FUNCTION
: [a-zA-Z]+ '(' (.*? | FUNCTION) ')'
;
literal_list
: '(' literal_value ( COMMA literal_value )* ')'
;
keyword
: K_AFTER
| K_AND
| K_ASC
| K_BEFORE
| K_BY
| K_CHANGED
| K_DESC
| K_IN
| K_IS
| K_NOT
| K_NULL
| K_ON
| K_OR
| K_ORDER
| K_TO
| K_WAS
;
state_name
: K_EMPTY
;
field
: F_AFFECTED_VERSION
| F_APPROVALS
| F_ASSIGNEE
| F_ATTACHMENTS
| F_CATEGORY
| F_COMMENT
| F_COMPONENT
| F_CREATED
| F_CREATED_DATE
| F_CREATOR
| F_CUSTOM_FIELD
| F_CUSTOMER_REQUEST_TYPE
| F_DATE
| F_DESCRIPTION
| F_DUE
| F_DURATION
| F_ENVIRONMENT
| F_EPIC_LINK
| F_FILTER
| F_FIX_VERSION
| F_ISSUE
| F_ISSUE_KEY
| F_ISSUE_TYPE
| F_KEY
| F_LABEL
| F_LABELS
| F_LAST_VIEWED
| F_LEVEL
| F_NUMBER
| F_ORGANIZATION
| F_ORIGINAL_ESTIMATE
| F_PARENT
| F_PRIORITY
| F_PROJECT
| F_RANK
| F_REMAINING_ESTIMATE
| F_REPORTER
| F_REQUEST_CHANNEL_TYPE
| F_REQUEST_LAST_ACTIVITY_TIME
| F_RESOLUTION
| F_RESOLUTION_DATE
| F_RESOLVED
| F_SLA
| F_SPRINT
| F_STATUS
| F_SUMMARY
| F_TEXT
| F_TIME_SPENT
| F_TYPE
| F_UPDATED
| F_USER
| F_VERSION
| F_VOTER
| F_VOTES
| F_WATCHER
| F_WATCHERS
| F_WORK_RATIO
;
compare_dates : ( K_ON | K_AFTER | K_BEFORE )? dates ;
dates : DATETIME ;
DATETIME
: ('-'|'+')? (NUMBER ('d'|'w'|'y'|'h'|'m')?)+
| ('"' DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT (DIGIT DIGIT ':' DIGIT DIGIT)? '"')
| ('\'' DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT (DIGIT DIGIT ':' DIGIT DIGIT)? '\'')
| ( DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT (DIGIT DIGIT ':' DIGIT DIGIT)? )
;
NUMBER : DIGIT+ ;
WHITESPACE : ' ' -> skip ;
SCOL : ';';
DOT : '.';
OPEN_PAR : '(';
CLOSE_PAR : ')';
COMMA : ',';
EQ : '=';
STAR : '*';
CONTAINS : '~';
NOT_CONTAINS : '!~';
LT : '<';
LT_EQ : '<=';
GT : '>';
GT_EQ : '>=';
NOT_EQ : '!=';
K_AFTER : A F T E R;
K_AND : A N D;
K_ASC : A S C;
K_BEFORE : B E F O R E;
K_BY : B Y;
K_CHANGED : C H A N G E D;
K_DESC : D E S C;
K_EMPTY : E M P T Y;
K_IN : I N;
K_IS : I S;
K_NOT : N O T;
K_NULL : N U L L;
K_ON : O N;
K_OR : O R;
K_ORDER : O R D E R;
K_TO : T O;
K_WAS : W A S;
F_AFFECTED_VERSION : A F F E C T E D V E R S I O N;
F_APPROVALS : A P P R O V A L S;
F_ASSIGNEE : A S S I G N E E;
F_ATTACHMENTS : A T T A C H M E N T S;
F_CATEGORY : C A T E G O R Y;
F_COMMENT : C O M M E N T;
F_COMPONENT : C O M P O N E N T;
F_CREATED : C R E A T E D;
F_CREATED_DATE : C R E A T E D D A T E;
F_CREATOR : C R E A T O R;
F_CUSTOM_FIELD : C F '[' NUMBER ']';
F_CUSTOMER_REQUEST_TYPE : C U S T O M E R R E Q U E S T T Y P E;
F_DATE : D A T E;
F_DESCRIPTION : D E S C R I P T I O N;
F_DUE : D U E;
F_DURATION : D U R A T I O N;
F_ENVIRONMENT : E N V I R O N M E N T;
F_EPIC_LINK : E P I C L I N K;
F_FILTER : F I L T E R;
F_FIX_VERSION : F I X V E R S I O N;
F_ISSUE : I S S U E;
F_ISSUE_KEY : I S S U E K E Y;
F_ISSUE_TYPE : I S S U E T Y P E;
F_KEY : K E Y;
F_LABEL : L A B E L;
F_LABELS : L A B E L S;
F_LAST_VIEWED : L A S T V I E W E D;
F_LEVEL : L E V E L;
F_NUMBER : N U M B E R;
F_ORGANIZATION : O R G A N I Z A T I O N;
F_ORIGINAL_ESTIMATE : O R I G I N A L E S T I M A T E;
F_PARENT : P A R E N T;
F_PRIORITY : P R I O R I T Y;
F_PROJECT : P R O J E C T;
F_RANK : R A N K;
F_REMAINING_ESTIMATE : R E M A I N I N G E S T I M A T E;
F_REPORTER : R E P O R T E R;
F_REQUEST_CHANNEL_TYPE : R E Q U E S T C H A N N E L T Y P E;
F_REQUEST_LAST_ACTIVITY_TIME : R E Q U E S T L A S T A C T I V I T Y T I M E;
F_RESOLUTION : R E S O L U T I O N;
F_RESOLUTION_DATE : R E S O L U T I O N D A T E;
F_RESOLVED : R E S O L V E D;
F_SLA : S L A;
F_SPRINT : S P R I N T;
F_STATUS : S T A T U S;
F_SUMMARY : S U M M A R Y;
F_TEXT : T E X T;
F_TIME_SPENT : T I M E S P E N T;
F_TYPE : T Y P E;
F_UPDATED : U P D A T E D;
F_USER : U S E R;
F_VERSION : V E R S I O N;
F_VOTER : V O T E R;
F_VOTES : V O T E S;
F_WATCHER : W A T C H E R;
F_WATCHERS : W A T C H E R S;
F_WORK_RATIO : W O R K R A T I O;
IDENTIFIER
: '"' (~'"' | '""')* '"'
| '`' (~'`' | '``')* '`'
| '[' ~']'* ']'
| [a-zA-Z_] [a-zA-Z_0-9.\-]* // TODO check: needs more chars in set
| '-'
| [A-Z]+ '-' [0-9]+ // ex) KEY-###
;
STRING_LITERAL
: '\'' ('\\'. | '\'\'' | ~('\'' | '\\'))* '\''
| '"' ( '\\'. | '""' | ~('"'| '\\') )* '"'
;
COMMENT
: '/*' .*? '*/' -> skip
;
LINE_COMMENT
: '//' ~[\r\n]* -> skip
;
SPACES
: [ \u000B\t\r\n] -> channel(HIDDEN)
;
fragment DIGIT : [0-9];
fragment A : [aA];
fragment B : [bB];
fragment C : [cC];
fragment D : [dD];
fragment E : [eE];
fragment F : [fF];
fragment G : [gG];
fragment H : [hH];
fragment I : [iI];
fragment J : [jJ];
fragment K : [kK];
fragment L : [lL];
fragment M : [mM];
fragment N : [nN];
fragment O : [oO];
fragment P : [pP];
fragment Q : [qQ];
fragment R : [rR];
fragment S : [sS];
fragment T : [tT];
fragment U : [uU];
fragment V : [vV];
fragment W : [wW];
fragment X : [xX];
fragment Y : [yY];
fragment Z : [zZ];
如何编写侦听器来处理此问题?我创建了一个visitor类,该类扩展了基本侦听器以创建我的实体,它们是否看到:
public class CqlListenerImpl extends CqlBaseListener {
private final List<Condition> conditions = new ArrayList<>();
private Condition currentCondition;
public List<Condition> getConditions() {
return conditions;
}
@Override
public void enterExpr(CqlParser.ExprContext ctx) {
this.currentCondition = new AndCondition(
stripQuotesFromString(ctx.getStart().getText()),
null,
stripQuotesFromString(ctx.getStop().getText())
);
}
}
公共类CqualListenerImpl扩展CqlBaseListener{
私有最终列表条件=新建ArrayList();
私人条件现状;
公共列表getConditions(){
返回条件;
}
@凌驾
public void enterExpr(CqlParser.ExprContext ctx){
this.currentCondition=new和condition(
stripQuotesFromString(ctx.getStart().getText()),
无效的
stripQuotesFromString(ctx.getStop().getText())
);
}
}
我有点不清楚你的问题到底是什么。您知道如何在语法中添加属性和操作吗?如果没有,您应该阅读一本关于Antlr的教程或入门书来处理这些问题。否则,我建议添加适当的返回属性和操作来创建它们。我想我现在已经找到了!请自己发布答案或删除问题,以避免混淆其他搜索者SO@sprinter当我完成这个类的实现后,我会发布我的答案——仍然在学习如何使用它,所以我不想用答案误导任何人。
public class CqlListenerImpl extends CqlBaseListener {
private final List<Condition> conditions = new ArrayList<>();
private Condition currentCondition;
public List<Condition> getConditions() {
return conditions;
}
@Override
public void enterExpr(CqlParser.ExprContext ctx) {
this.currentCondition = new AndCondition(
stripQuotesFromString(ctx.getStart().getText()),
null,
stripQuotesFromString(ctx.getStop().getText())
);
}
}