Some more elements for a *parser* of LaTeX.

>>>>>>>>>>>>>>>>>

import scala.util.parsing.combinator.Parsers
import scala.util.parsing.input.{NoPosition, Position, Reader}

object LaTeXParser extends Parsers {
  override type Elem = LaTeXToken

class LaTeXTokenReader(tokens: Seq[LaTeXToken]) extends Reader[Seq[LaTeXToken]] {
  override def first: Seq[LaTeXToken] = tokens.head::Nil
  override def atEnd: Boolean = tokens.isEmpty
  override def pos:   Position = NoPosition
  override def rest:  Reader[Seq[LaTeXToken]] = new LaTeXTokenReader(tokens.tail)
}
}

compiles, but the rest does not work. Unknown parsers etc.
Pb apparently with importing.
This commit is contained in:
Burkhart Wolff 2018-03-28 13:08:55 +02:00
parent 38f8772a6a
commit df5bf507cf
2 changed files with 24 additions and 11 deletions

View File

@ -123,6 +123,8 @@ object LaTeXLexer extends RegexParsers {
} }
} }
/* Some opeations on token streams */
/* pre: head(S) <> begin */ /* pre: head(S) <> begin */
/* post: res = (A,B) where S == A ++ B and /* post: res = (A,B) where S == A ++ B and
where begin@A is a begin-end where begin@A is a begin-end
@ -182,6 +184,7 @@ def transducer (S:List[LaTeXToken]) : List[LaTeXToken] =
case Nil => Nil case Nil => Nil
} }
/* A more abstract approach, that is based on a two-level parsing approach */ /* A more abstract approach, that is based on a two-level parsing approach */
import scala.util.parsing.combinator.Parsers import scala.util.parsing.combinator.Parsers
@ -190,26 +193,36 @@ import scala.util.parsing.input.{NoPosition, Position, Reader}
object LaTeXParser extends Parsers { object LaTeXParser extends Parsers {
override type Elem = LaTeXToken override type Elem = LaTeXToken
class LaTeXTokenReader(tokens: Seq[LaTeXToken]) extends Reader[LaTeXToken] { class LaTeXTokenReader(tokens: Seq[LaTeXToken]) extends Reader[Seq[LaTeXToken]] {
override def first: LaTeXToken = tokens.head override def first: Seq[LaTeXToken] = tokens.head::Nil
override def atEnd: Boolean = tokens.isEmpty override def atEnd: Boolean = tokens.isEmpty
override def pos: Position = NoPosition override def pos: Position = NoPosition
override def rest: Reader[LaTeXToken] = new LaTeXTokenReader(tokens.tail) override def rest: Reader[Seq[LaTeXToken]] = new LaTeXTokenReader(tokens.tail)
} }
def apply(tokens: Seq[LaTeXToken]): Either[LaTeXParserError, LaTeXToken] = {
def apply(tokens: Seq[LaTeXToken]): Either[LaTeXParserError, Seq[LaTeXToken]] = {
val reader = new LaTeXTokenReader(tokens) val reader = new LaTeXTokenReader(tokens)
program(reader) match { parse_latex(reader) match {
case NoSuccess(msg, next) => Left(LaTeXParserError(Location(next.pos.line, next.pos.column), msg)) case NoSuccess(msg, next) => Left(LaTeXParserError(Location(next.pos.line,
next.pos.column),
msg))
case Success(result, next) => Right(result) case Success(result, next) => Right(result)
} }
} }
def program: Parser[LaTeXToken] = positioned { def parse_latex: Parser[Seq[LaTeXToken]] = positioned {
phrase(block) phrase(sections)
} }
def sections: Parser[Seq[LaTeXToken]] = positioned {
rep1(section) ^^ { case stmtList => stmtList.flatten }
}
def section: Parser[Seq[LaTeXToken]] = positioned {
RAWTEXT() ^^ { case rt @ RAWTEXT (id) => rt::Nil }
}
} }