forked from Isabelle_DOF/Isabelle_DOF
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:
parent
38f8772a6a
commit
df5bf507cf
|
@ -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 }
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in New Issue