From a4635fb95235ba4bf077bd59957da0626fc5ba72 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Tue, 14 Dec 2021 12:34:06 -0500 Subject: EC, a terminal-based RPN calculator --- src/parser_driver.cc | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/parser_driver.cc (limited to 'src/parser_driver.cc') diff --git a/src/parser_driver.cc b/src/parser_driver.cc new file mode 100644 index 0000000..60e59ab --- /dev/null +++ b/src/parser_driver.cc @@ -0,0 +1,71 @@ +// Copyright 2021 Benjamin Barenblat +// +// 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 +// +// https://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. + +#include "src/parser_driver.h" + +#include + +#include +#include + +#include "src/CalculatorBaseVisitor.h" +#include "src/CalculatorLexer.h" +#include "src/CalculatorParser.h" +#include "src/language.h" +#include "third_party/abseil/absl/strings/string_view.h" + +namespace ec { + +namespace { + +template +std::shared_ptr MakeTerm(Args... args) { + return std::static_pointer_cast(std::make_shared(args...)); +} + +class Visitor : public CalculatorBaseVisitor { + public: + antlrcpp::Any visitProgram(CalculatorParser::ProgramContext* ctx) override { + Program p; + for (CalculatorParser::TermContext* term : ctx->term()) { + p.push_back(visit(term)); + } + return p; + } + + antlrcpp::Any visitNumber(CalculatorParser::NumberContext* ctx) override { + return MakeTerm(ctx->value); + } + + antlrcpp::Any visitIdentifier( + CalculatorParser::IdentifierContext* ctx) override { + return MakeTerm(ctx->value); + } + + antlrcpp::Any visitError(CalculatorParser::ErrorContext*) override { + throw ParseError(); + } +}; + +} // namespace + +Program ParseFromString(absl::string_view text) { + antlr4::ANTLRInputStream input(text.data(), text.size()); + CalculatorLexer lexer(&input); + antlr4::CommonTokenStream tokens(&lexer); + CalculatorParser parser(&tokens); + return Visitor().visit(parser.program()); +} + +} // namespace ec -- cgit v1.2.3