Changeset 6882
- Timestamp:
- 12/29/15 21:10:23 (8 years ago)
- Location:
- FCSSimpleEndpoint/trunk/src/main/java/eu/clarin/sru/server/fcs
- Files:
-
- 22 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
FCSSimpleEndpoint/trunk/src/main/java/eu/clarin/sru/server/fcs/FCSQueryParser.java
r6858 r6882 1 1 package eu.clarin.sru.server.fcs; 2 2 3 import java.util.ArrayList;4 3 import java.util.Arrays; 5 4 import java.util.Collections; … … 7 6 import java.util.Map; 8 7 9 import org.antlr.v4.runtime.ANTLRInputStream;10 import org.antlr.v4.runtime.BaseErrorListener;11 import org.antlr.v4.runtime.CommonTokenStream;12 import org.antlr.v4.runtime.RecognitionException;13 import org.antlr.v4.runtime.Recognizer;14 import org.antlr.v4.runtime.tree.ParseTree;15 import eu.clarin.sru.fcs.qlparser.FCSLexer;16 import eu.clarin.sru.fcs.qlparser.FCSParser;17 8 import eu.clarin.sru.server.SRUConstants; 18 9 import eu.clarin.sru.server.SRUDiagnosticList; … … 21 12 import eu.clarin.sru.server.SRUQueryParser; 22 13 import eu.clarin.sru.server.SRUVersion; 14 import eu.clarin.sru.server.fcs.parser.QueryNode; 15 import eu.clarin.sru.server.fcs.parser.QueryParser; 16 import eu.clarin.sru.server.fcs.parser.QueryParserException; 23 17 24 public class FCSQueryParser implements SRUQueryParser< ParseTree> {18 public class FCSQueryParser implements SRUQueryParser<QueryNode> { 25 19 private static final String PARAM_QUERY = "query"; 26 20 private static final List<String> QUERY_PARAMETER_NAMES = 27 21 Collections.unmodifiableList(Arrays.asList(PARAM_QUERY)); 22 private final QueryParser parser = new QueryParser(); 23 28 24 29 25 @Override … … 58 54 59 55 @Override 60 public SRUQuery< ParseTree> parseQuery(SRUVersion version,56 public SRUQuery<QueryNode> parseQuery(SRUVersion version, 61 57 Map<String, String> parameters, SRUDiagnosticList diagnostics) { 62 58 FCSQuery result = null; … … 69 65 } 70 66 71 ParseErrorListener errorListener = new ParseErrorListener();72 67 try { 73 ANTLRInputStream input = new ANTLRInputStream(rawQuery); 74 FCSLexer lexer = new FCSLexer(input); 75 CommonTokenStream tokens = new CommonTokenStream(lexer); 76 FCSParser parser = new FCSParser(tokens); 77 /* 78 * clear (possible) default error listeners and set our own! 79 */ 80 lexer.removeErrorListeners(); 81 lexer.addErrorListener(errorListener); 82 parser.removeErrorListeners(); 83 parser.addErrorListener(errorListener); 84 85 /* 86 * other Lexer/Parser configuration ... 87 */ 88 parser.setTrimParseTree(true); 89 90 /* 91 * commence parsing ... 92 */ 93 ParseTree tree = parser.query(); 94 95 if (!errorListener.hasErrors() && 96 (parser.getNumberOfSyntaxErrors() == 0)) { 97 result = new FCSQuery(rawQuery, parser, tree); 98 } else { 99 if (errorListener.hasErrors()) { 100 for (String error : errorListener.getErrors()) { 101 diagnostics.addDiagnostic( 102 Constants.FCS_DIAGNOSTIC_GENERAL_QUERY_SYNTAX_ERROR, 103 null, error); 104 } 105 } else { 106 diagnostics.addDiagnostic( 107 Constants.FCS_DIAGNOSTIC_GENERAL_QUERY_SYNTAX_ERROR, 108 null, "Query could not be parsed."); 109 } 110 } 68 QueryNode parsedQuery = parser.parse(rawQuery); 69 result = new FCSQuery(rawQuery, parsedQuery); 70 } catch (QueryParserException e) { 71 diagnostics.addDiagnostic(Constants.FCS_DIAGNOSTIC_GENERAL_QUERY_SYNTAX_ERROR, 72 null, e.getMessage()); 111 73 } catch (Exception e) { 112 74 diagnostics.addDiagnostic(SRUConstants.SRU_GENERAL_SYSTEM_ERROR, … … 117 79 118 80 119 public static final class FCSQuery extends SRUQueryBase<ParseTree> { 120 private final FCSParser parser; 81 public static final class FCSQuery extends SRUQueryBase<QueryNode> { 121 82 122 private FCSQuery(String rawQuery, 123 FCSParser parser, 124 ParseTree parsedQuery) { 83 private FCSQuery(String rawQuery, QueryNode parsedQuery) { 125 84 super(rawQuery, parsedQuery); 126 this.parser = parser;127 85 } 128 86 … … 132 90 return Constants.FCS_QUERY_TYPE_FCS; 133 91 } 134 135 136 /**137 * EXPERIMENTAL API: Get the parser that was used to parse the query.138 * Useful for outputting the parse tree.139 *140 * @return the parser that was used to parse the query.141 */142 public FCSParser getFCSParser() {143 return parser;144 }145 }146 147 148 private static final class ParseErrorListener extends BaseErrorListener {149 private List<String> errors = null;150 151 152 @Override153 public void syntaxError(Recognizer<?, ?> recognizer,154 Object offendingSymbol, int line, int charPositionInLine,155 String msg, RecognitionException e) {156 if (errors == null) {157 errors = new ArrayList<String>();158 }159 errors.add(msg);160 }161 162 163 public boolean hasErrors() {164 return (errors != null) && !errors.isEmpty();165 }166 167 168 public List<String> getErrors() {169 return errors;170 }171 92 } 172 93
Note: See TracChangeset
for help on using the changeset viewer.