/*
* Copyright 2008-2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.nominanuda.urispec;
import java.util.HashMap;
import org.antlr.v4.runtime.CommonToken;
import org.antlr.v4.runtime.ParserRuleContext;
import com.nominanuda.urispec.UriSpecParser.AnonExprContext;
import com.nominanuda.urispec.UriSpecParser.AnonExprTokens1Context;
import com.nominanuda.urispec.UriSpecParser.AnonExprTokens2Context;
import com.nominanuda.urispec.UriSpecParser.AnonExprTokens3Context;
import com.nominanuda.urispec.UriSpecParser.AnonExprTokensContext;
import com.nominanuda.urispec.UriSpecParser.AnyCharsContext;
import com.nominanuda.urispec.UriSpecParser.AnyChars_tContext;
import com.nominanuda.urispec.UriSpecParser.AnySequenceContext;
import com.nominanuda.urispec.UriSpecParser.AnySequence_tContext;
import com.nominanuda.urispec.UriSpecParser.Fragment_Context;
import com.nominanuda.urispec.UriSpecParser.NamedExprContext;
import com.nominanuda.urispec.UriSpecParser.NamedExprTokensContext;
import com.nominanuda.urispec.UriSpecParser.PDeclContext;
import com.nominanuda.urispec.UriSpecParser.PExprContext;
import com.nominanuda.urispec.UriSpecParser.PSeqContext;
import com.nominanuda.urispec.UriSpecParser.PSeqTokensContext;
import com.nominanuda.urispec.UriSpecParser.ParamNameContext;
import com.nominanuda.urispec.UriSpecParser.ParamSepContext;
import com.nominanuda.urispec.UriSpecParser.ParamsGroupContext;
import com.nominanuda.urispec.UriSpecParser.ProgramContext;
import com.nominanuda.urispec.UriSpecParser.QueryContext;
import com.nominanuda.urispec.UriSpecParser.SchemeAuthorityAndPathContext;
import com.nominanuda.urispec.UriSpecParser.SequenceContext;
import com.nominanuda.urispec.UriSpecParser.Sequence_tContext;
import com.nominanuda.urispec.UriSpecParser.UriCharsContext;
import com.nominanuda.urispec.UriSpecParser.UriChars_tContext;
import com.nominanuda.urispec.UriSpecParser.UrispecContext;
import com.nominanuda.urispec.UriSpecParser.VarNameContext;
import static com.nominanuda.urispec.UriSpecParser.*;
public class AstCompatGeneratingVisitor<T> extends UriSpecBaseVisitor<T> {
private final NodeAdapter nodeAdapter;// = new NodeAdapter();
private CommonTree root = new CommonTree();
private HashMap<ParserRuleContext, CommonTree> m = new HashMap<>();
public AstCompatGeneratingVisitor(NodeAdapter treeAdaptor) {
this.nodeAdapter = treeAdaptor;
}
public CommonTree getRoot() {
return root;
}
private CommonTree create(ParserRuleContext ctx) {
return nodeAdapter.create(new CommonToken(ctx.getStart().getType(), ctx.getText()));
}
private CommonTree getAstParent(ParserRuleContext ctx) {
ParserRuleContext pCtx = ctx.getParent();
if(pCtx == null) return root;
CommonTree t = null;
while(t == null) {
t = m.get(pCtx);
pCtx = pCtx.getParent();
}
return t;
}
private void on(ParserRuleContext ctx) {
createAndAppendAst(ctx);
//System.err.println(ctxName(ctx)+" -> "+ctx.getText() + " => "+ctxName(ctx.getParent()));
}
// private String ctxName(ParserRuleContext ctx) {
// return ctx.getClass().getSimpleName();//.substring("UriSpecParser$".length());
// }
private void createAndAppendAst(ParserRuleContext ctx) {
CommonTree t = create(ctx);
appendAst(ctx, t);
}
private void appendAst(ParserRuleContext ctx, CommonTree t) {
getAstParent(ctx).addChild(t);
m.put(ctx, t);
}
private CommonTree tok(int type) {
ParserRuleContext ctx = new ParserRuleContext();
ctx.start = new CommonToken(type);
return create(ctx);// new CommonTree(new CommonToken(type));
}
private CommonTree tok(int type, String txt) {
return new CommonTree(new CommonToken(type, txt));
}
// program : urispec EOF
// //-> ^( URI_SPEC urispec )
@Override
public T visitProgram(ProgramContext ctx) {
m.put(ctx, root);
//on(ctx);
return super.visitProgram(ctx);
}
// urispec : schemeAuthorityAndPath (QMARK! query?)? (POUND! fragment_?)?;
@Override
public T visitUrispec(UrispecContext ctx) {
//on(ctx);
appendAst(ctx, tok(URI_SPEC));
return super.visitUrispec(ctx);
}
// schemeAuthorityAndPath : sequence
// //-> ^(SCHEME_AUTH_PATH_PART sequence)
@Override
public T visitSchemeAuthorityAndPath(SchemeAuthorityAndPathContext ctx) {
//on(ctx);
appendAst(ctx, tok(SCHEME_AUTH_PATH_PART));
return super.visitSchemeAuthorityAndPath(ctx);
}
// fragment_ : sequence
// //-> ^(FRAGMENT_PART sequence)
@Override
public T visitFragment_(Fragment_Context ctx) {
//on(ctx);
appendAst(ctx, tok(FRAGMENT_PART));
return super.visitFragment_(ctx);
}
// sequence : sequence_t
@Override
public T visitSequence(SequenceContext ctx) {
//on(ctx);
return super.visitSequence(ctx);
}
// //-> ^(SEQUENCE sequence_t)
// sequence_t : (namedExpr | anonExpr|uriChars)+;
@Override
public T visitSequence_t(Sequence_tContext ctx) {
//on(ctx);
appendAst(ctx, tok(SEQUENCE));
return super.visitSequence_t(ctx);
}
// anySequence_t: (namedExpr | anonExpr|anyChars)+;
@Override
public T visitAnySequence_t(AnySequence_tContext ctx) {
// on(ctx);
return super.visitAnySequence_t(ctx);
}
// anySequence : anySequence_t
// //-> ^(SEQUENCE anySequence_t)
@Override
public T visitAnySequence(AnySequenceContext ctx) {
// on(ctx);
appendAst(ctx, tok(SEQUENCE));
return super.visitAnySequence(ctx);
}
// uriChars : uriChars_t
// //-> ^(CHARACTERS uriChars_t)
@Override
public T visitUriChars(UriCharsContext ctx) {
// on(ctx);
appendAst(ctx, tok(CHARACTERS));
return super.visitUriChars(ctx);
}
// uriChars_t: (URI_CHARS)+;
@Override
public T visitUriChars_t(UriChars_tContext ctx) {
on(ctx);
return super.visitUriChars_t(ctx);
}
// anyChars: anyChars_t
// //-> ^(CHARACTERS anyChars_t)
@Override
public T visitAnyChars(AnyCharsContext ctx) {
// on(ctx);
appendAst(ctx, tok(CHARACTERS));
return super.visitAnyChars(ctx);
}
// anyChars_t: (URI_CHARS|MATCHER)+;
@Override
public T visitAnyChars_t(AnyChars_tContext ctx) {
on(ctx);
return super.visitAnyChars_t(ctx);
}
// namedExpr : namedExprTokens
// //-> ^(NAMED_EXPRESSION namedExprTokens)
@Override
public T visitNamedExpr(NamedExprContext ctx) {
//on(ctx);
appendAst(ctx, tok(NAMED_EXPRESSION));
return super.visitNamedExpr(ctx);
}
// namedExprTokens: BEGIN_NAMED_EXPR! varName (WS! anySequence ( ALTERNATIVE! anySequence )*)? (ALTERNATIVE!)? END_NAMED_EXPR!;
@Override
public T visitNamedExprTokens(NamedExprTokensContext ctx) {
//on(ctx);
return super.visitNamedExprTokens(ctx);
}
// anonExpr : anonExprTokens
// //-> ^(ANONYMOUS_EXPRESSION anonExprTokens )
@Override
public T visitAnonExpr(AnonExprContext ctx) {
// on(ctx);
appendAst(ctx, tok(ANONYMOUS_EXPRESSION));
return super.visitAnonExpr(ctx);
}
// anonExprTokens: anonExprTokens1 | anonExprTokens2 | anonExprTokens3;
@Override
public T visitAnonExprTokens(AnonExprTokensContext ctx) {
//on(ctx);
return super.visitAnonExprTokens(ctx);
}
// anonExprTokens1: (BEGIN_ANON_EXPR! sequence ( ALTERNATIVE! sequence )* END_ANON_EXPR!);
@Override
public T visitAnonExprTokens1(AnonExprTokens1Context ctx) {
//on(ctx);
return super.visitAnonExprTokens1(ctx);
}
// anonExprTokens2
// :
// (BEGIN_ANON_EXPR sequence ( ALTERNATIVE sequence )* ALTERNATIVE END_ANON_EXPR)
// //-> sequence* ^(SEQUENCE ^(CHARACTERS URI_CHARS[""]))
@Override
public T visitAnonExprTokens2(AnonExprTokens2Context ctx) {
//on(ctx);
T res = super.visitAnonExprTokens2(ctx);
appendAst(ctx, tok(SEQUENCE));
appendAst(ctx, tok(CHARACTERS));
appendAst(ctx, tok(UriSpecParser.URI_CHARS, ""));
return res;
}
// anonExprTokens3
// :
// (BEGIN_ANON_EXPR ALTERNATIVE sequence ( ALTERNATIVE sequence )* END_ANON_EXPR)
// //-> ^(SEQUENCE ^(CHARACTERS URI_CHARS[""])) sequence*
@Override
public T visitAnonExprTokens3(AnonExprTokens3Context ctx) {
// on(ctx);
appendAst(ctx, tok(SEQUENCE));
appendAst(ctx, tok(CHARACTERS));
appendAst(ctx, tok(UriSpecParser.URI_CHARS, ""));
T res = super.visitAnonExprTokens3(ctx);
return res;
}
// query : pSeq paramSep //-> ^(QUERY_PART pSeq STRICT_PARAMS)
// | pSeq //-> ^(QUERY_PART pSeq)
@Override
public T visitQuery(QueryContext ctx) {
//on(ctx);
appendAst(ctx, tok(QUERY_PART));
return super.visitQuery(ctx);
}
// pSeq : pSeqTokens
// //-> ^(PARAM_SEQUENCE pSeqTokens)
@Override
public T visitPSeq(PSeqContext ctx) {
// on(ctx);
appendAst(ctx, tok(PARAM_SEQUENCE));
return super.visitPSeq(ctx);
}
// pSeqTokens : pExpr (paramSep! pExpr)*
@Override
public T visitPSeqTokens(PSeqTokensContext ctx) {
// on(ctx);
return super.visitPSeqTokens(ctx);
}
// pExpr : (pDecl | paramsGroup)
// //-> ^(PARAM_DECL pDecl)? ^(PARAM_GROUP paramsGroup)?
@Override
public T visitPExpr(PExprContext ctx) {
// on(ctx);
return super.visitPExpr(ctx);
}
// pDecl : namedExpr |paramName EQUALS! sequence?;
@Override
public T visitPDecl(PDeclContext ctx) {
//on(ctx);
appendAst(ctx, tok(PARAM_DECL));
return super.visitPDecl(ctx);
}
// paramsGroup : BEGIN_ANON_EXPR! pSeq ( ALTERNATIVE! pSeq )* END_ANON_EXPR!;
@Override
public T visitParamsGroup(ParamsGroupContext ctx) {
// on(ctx);
appendAst(ctx, tok(PARAM_GROUP));
return super.visitParamsGroup(ctx);
}
// paramName : URI_CHARS;
@Override
public T visitParamName(ParamNameContext ctx) {
on(ctx);
return super.visitParamName(ctx);
}
// noRule....
@Override
public T visitParamSep(ParamSepContext ctx) {
//on(ctx);
return super.visitParamSep(ctx);
}
//varName : URI_CHARS;
@Override
public T visitVarName(VarNameContext ctx) {
on(ctx);
// createAndAppendAst(ctx);
return super.visitVarName(ctx);
}
///////////////////////////////////
///////////////////////////////////
}