aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2014-11-29 19:21:28 +0000
committerdos-reis <gdr@axiomatics.org>2014-11-29 19:21:28 +0000
commit11fd57def249cbc6f4aee8dfaac5e7f346f483c0 (patch)
tree7185e026223f007c21ee41f22959250f38d6ce53 /src/include
parente9d8e2490f4dff922c0d86f29f31227655cc0633 (diff)
downloadopen-axiom-11fd57def249cbc6f4aee8dfaac5e7f346f483c0.tar.gz
Move code from bemol.cc to library.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/InputFragment.h90
-rw-r--r--src/include/token.H42
2 files changed, 114 insertions, 18 deletions
diff --git a/src/include/InputFragment.h b/src/include/InputFragment.h
new file mode 100644
index 00000000..7f317973
--- /dev/null
+++ b/src/include/InputFragment.h
@@ -0,0 +1,90 @@
+// -*- C++ -*-
+// Copyright (C) 2014, Gabriel Dos Reis.
+// All rights reserved.
+// Written by Gabriel Dos Reis.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// - Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// - Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in
+// the documentation and/or other materials provided with the
+// distribution.
+//
+// - Neither the name of OpenAxiom. nor the names of its contributors
+// may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// --% Author: Gabriel Dos Reis
+
+#ifndef OPENAXIOM_INPUTFRAGMENT_included
+#define OPENAXIOM_INPUTFRAGMENT_included
+
+#include <open-axiom/token>
+
+namespace OpenAxiom {
+ // A physical line is just raw text, coupled with location
+ // information such as line and indentation column.
+ struct Line : std::string {
+ LineNumber number;
+ ColumnIndex indent;
+ Line() : number(), indent() { }
+
+ std::string sub_string(ColumnIndex s, ColumnIndex e) const {
+ return substr(s, e - s);
+ }
+ };
+
+ // A program fragment is a logical line, composed of possibly
+ // several physical lines subject to the off-side rule. As a
+ // special case, a line ending with the underbar character
+ // continues to the next line with disregard to the off-side rule.
+ struct Fragment : std::vector<Line> {
+ explicit operator bool() const { return not empty(); }
+ // Holds if the last physical line ends with line continuation marker.
+ bool line_continuation() const {
+ return not empty() and back().back() == '_';
+ }
+ // Return the indentation of the last physical line of this fragment.
+ ColumnIndex last_indent() const {
+ return empty() ? 0 : back().indent;
+ }
+ using std::vector<Line>::operator[];
+ // Reference a line given by a position into this fragment.
+ const Line& operator()(const OpenAxiom::FragmentCursor& pos) const {
+ return (*this)[pos.line];
+ }
+ // Reference a character code unit at the position into this fragment.
+ uint8_t operator[](const OpenAxiom::FragmentCursor& pos) const {
+ return (*this)[pos.line][pos.column];
+ }
+ // Advance the cursor position to the next character code unit.
+ uint8_t advance(OpenAxiom::FragmentCursor& pos) const {
+ return (*this)[pos.line][pos.column++];
+ }
+ // This predicate holds if this fragment covers the cursor position.
+ bool covering(const OpenAxiom::FragmentCursor& pos) const {
+ return pos.column < (*this)[pos.line].size();
+ }
+ };
+
+ std::ostream& operator<<(std::ostream&, const Fragment&);
+}
+
+#endif // OPENAXIOM_INPUTFRAGMENT_included
diff --git a/src/include/token.H b/src/include/token.H
index 719f6e5f..71d6cb10 100644
--- a/src/include/token.H
+++ b/src/include/token.H
@@ -75,6 +75,10 @@ namespace OpenAxiom {
std::ostream& operator<<(std::ostream&, TokenValue);
+ // Datatypes for locating lines and columns.
+ using LineNumber = std::size_t;
+ using ColumnIndex = std::size_t;
+
// Given a symbolic or alphabetic token, retrieve its category
// and associated abstract value.
struct TokenClassification {
@@ -88,31 +92,33 @@ namespace OpenAxiom {
TokenClassification classify(const std::string&);
- // Datatypes for locating lines and columns.
- using LineNumber = std::size_t;
- using ColumnIndex = std::size_t;
-
// Cursor into a fragment.
struct FragmentCursor {
std::size_t line; // index of a line in a fragment
std::size_t column; // column number at line.
- };
- inline FragmentCursor& operator++(FragmentCursor& p) {
- ++p.column;
- return p;
- }
+ inline FragmentCursor& operator++() {
+ ++column;
+ return *this;
+ }
- inline FragmentCursor operator++(FragmentCursor& p, int) {
- auto q = p;
- ++p;
- return q;
- }
+ inline FragmentCursor operator++(int) {
+ auto tmp = *this;
+ ++*this;
+ return tmp;
+ }
- inline FragmentCursor& operator--(FragmentCursor& p) {
- --p.column;
- return p;
- }
+ inline FragmentCursor& operator--() {
+ --column;
+ return *this;
+ }
+
+ inline FragmentCursor operator--(int) {
+ auto tmp = *this;
+ --*this;
+ return tmp;
+ }
+ };
// -- Exception types
struct EndOfStringUnseen {