diff --git a/libwccl/parser/Parser.cpp b/libwccl/parser/Parser.cpp index b713ae67c32644d43116adc4161e2baeffd28930..86389a32f0ec313a00b416f233ff695bd3a21767 100644 --- a/libwccl/parser/Parser.cpp +++ b/libwccl/parser/Parser.cpp @@ -4,6 +4,7 @@ #include <antlr/NoViableAltException.hpp> #include <antlr/MismatchedTokenException.hpp> +#include <antlr/TokenStreamRecognitionException.hpp> namespace Wccl { @@ -190,6 +191,11 @@ boost::shared_ptr<ANTLRParserResultBase> Parser::parseAnyOperator( << "(as tset ) " << e.getFileLineColumnString() << " " << e.getMessage(); + } catch(antlr::TokenStreamRecognitionException &e) { + errors << std::endl + << "(as tset ) " + << e.getLine() << ":" << e.getColumn() + << " " << e.getMessage(); } catch (antlr::ANTLRException& e) { errors << std::endl << "(as tset ) " << e.getMessage(); @@ -213,6 +219,11 @@ boost::shared_ptr<ANTLRParserResultBase> Parser::parseAnyOperator( << "(as strset ) " << e.getFileLineColumnString() << " " << e.getMessage(); + } catch(antlr::TokenStreamRecognitionException &e) { + errors << std::endl + << "(as strset ) " + << e.getLine() << ":" << e.getColumn() + << " " << e.getMessage(); } catch (antlr::ANTLRException& e) { errors << std::endl << "(as strset ) " << e.getMessage(); @@ -236,6 +247,11 @@ boost::shared_ptr<ANTLRParserResultBase> Parser::parseAnyOperator( << "(as bool ) " << e.getFileLineColumnString() << " " << e.getMessage(); + } catch(antlr::TokenStreamRecognitionException &e) { + errors << std::endl + << "(as bool ) " + << e.getLine() << ":" << e.getColumn() + << " " << e.getMessage(); } catch (antlr::ANTLRException& e) { errors << std::endl << "(as bool ) " << e.getMessage(); @@ -254,6 +270,11 @@ boost::shared_ptr<ANTLRParserResultBase> Parser::parseAnyOperator( << "(as position) " << e.getFileLineColumnString() << " " << e.getMessage() << std::endl; + } catch(antlr::TokenStreamRecognitionException &e) { + errors << std::endl + << "(as position) " + << e.getLine() << ":" << e.getColumn() + << " " << e.getMessage(); } catch(antlr::NoViableAltException &e) { errors << std::endl << "(as position) " diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g index c0f08ca068f06e5412f16bf79ec77c5608bc2ce6..d4ee973a0ad697c0d99c78ee1c0491fd9f4480ca 100644 --- a/libwccl/parser/grammar.g +++ b/libwccl/parser/grammar.g @@ -43,6 +43,7 @@ header { #include <libwccl/ops/functions/strset/tolower.h> #include <libwccl/ops/functions/strset/getlemmas.h> + #include <libwccl/ops/functions/tset/agrfilter.h> #include <libwccl/ops/functions/tset/catfilter.h> #include <libwccl/ops/functions/tset/getsymbols.h> #include <libwccl/ops/functions/tset/getwordclass.h> @@ -498,10 +499,11 @@ symset_operator returns [boost::shared_ptr<Function<TSet> > ret] : ret = symset_condition [tagset, vars] | (SYMBOL LBRACKET) => (ret = symset_getsymbol [tagset, vars]) - | ret = symset_var_val [tagset, vars] - | ret = symset_class [tagset, vars] - | ret = symset_range [tagset, vars] - | ret = symset_catflt [tagset, vars] + | ret = symset_var_val [tagset, vars] + | ret = symset_class [tagset, vars] + | ret = symset_range [tagset, vars] + | ret = symset_catflt [tagset, vars] + | ret = symset_agrflt [tagset, vars] // | LPAREN ret = symset_operator [tagset, vars] RPAREN ; @@ -621,6 +623,26 @@ symset_catflt } ; +// ---------------------------------------------------------------------------- +// Agrflt operator +symset_agrflt + [const Corpus2::Tagset& tagset, Variables& vars] + returns [boost::shared_ptr<Function<TSet> > ret] +{ + boost::shared_ptr<Function<TSet> > attr, mask; + boost::shared_ptr<Function<Position> > lpos, rpos; +} + : "agrflt" LPAREN + lpos = position_operator [tagset, vars] COMMA + rpos = position_operator [tagset, vars] COMMA + attr = symset_operator [tagset, vars] COMMA + mask = symset_operator [tagset, vars] + RPAREN { + ret.reset(new AgrFilter(lpos, rpos, attr, mask, tagset)); + } +; + + /////////////////////////////////////////////////////////////////////////////// // Position operator // Returns boost::shared_ptr<Function<Position> > diff --git a/wcclparser/bool_main.cpp b/wcclparser/bool_main.cpp index c1570b0192c50eeb7b63dc657797a782d51b54a4..05c842797d63463530c98d4bcd7bbd73253ea714 100644 --- a/wcclparser/bool_main.cpp +++ b/wcclparser/bool_main.cpp @@ -2,8 +2,10 @@ #include <libwccl/values/bool.h> #include <libwccl/parser/Parser.h> #include <libwccl/parser/ANTLRParserResult.h> + #include <antlr/NoViableAltException.hpp> #include <antlr/MismatchedTokenException.hpp> +#include <antlr/TokenStreamRecognitionException.hpp> // ---------------------------------------------------------------------------- @@ -68,11 +70,15 @@ int main() } catch(antlr::NoViableAltException &e) { std::cerr << e.getFileLineColumnString() << " " << e.getMessage() << std::endl; + } catch(antlr::TokenStreamRecognitionException &e) { + std::cerr << e.getLine() << ":" << e.getColumn() + << " " << e.getMessage() << std::endl; } catch (Wccl::InvalidVariableName &e) { std::cerr << "Wccl::InvalidVariableName" << std::endl; } catch (Wccl::VariableTypeMismatch &e) { std::cerr << "Wccl::VariableTypeMismatch" << std::endl; - } catch (...) { + } + catch (...) { std::cerr << "[N] Syntax error!" << std::endl; } } diff --git a/wcclparser/strop_main.cpp b/wcclparser/strop_main.cpp index 13be60bd501fb89d186cdf3eb22b8f514ad2467f..aaf4c97f401a4113af38a9892c7285f1dbb54f59 100644 --- a/wcclparser/strop_main.cpp +++ b/wcclparser/strop_main.cpp @@ -4,6 +4,7 @@ #include <libwccl/parser/ANTLRParserResult.h> #include <antlr/NoViableAltException.hpp> #include <antlr/MismatchedTokenException.hpp> +#include <antlr/TokenStreamRecognitionException.hpp> // ---------------------------------------------------------------------------- @@ -67,6 +68,9 @@ int main() } catch(antlr::NoViableAltException &e) { std::cerr << e.getFileLineColumnString() << " " << e.getMessage() << std::endl; + } catch(antlr::TokenStreamRecognitionException &e) { + std::cerr << e.getLine() << ":" << e.getColumn() + << " " << e.getMessage() << std::endl; } catch (Wccl::InvalidVariableName &e) { std::cerr << "Wccl::InvalidVariableName" << std::endl; } catch (Wccl::VariableTypeMismatch &e) { diff --git a/wcclparser/tagset_main.cpp b/wcclparser/tagset_main.cpp index ddfaaa49af18a7f0eb313866e500b4f4f2ca5fc9..94f84f9bef84294f45e86595f28fb3a80ec1f614 100644 --- a/wcclparser/tagset_main.cpp +++ b/wcclparser/tagset_main.cpp @@ -4,6 +4,7 @@ #include <libwccl/parser/ANTLRParserResult.h> #include <antlr/NoViableAltException.hpp> #include <antlr/MismatchedTokenException.hpp> +#include <antlr/TokenStreamRecognitionException.hpp> #include <libcorpus2/tagsetmanager.h> @@ -69,6 +70,9 @@ int main() } catch(antlr::NoViableAltException &e) { std::cerr << e.getFileLineColumnString() << " " << e.getMessage() << std::endl; + } catch(antlr::TokenStreamRecognitionException &e) { + std::cerr << e.getLine() << ":" << e.getColumn() + << " " << e.getMessage() << std::endl; } catch (Wccl::InvalidVariableName &e) { std::cerr << "Wccl::InvalidVariableName" << std::endl; } catch (Wccl::VariableTypeMismatch &e) {