object EbnfParser extends RegexParsers
Parser for EBNF specifications
Intended usage is via the apply
method to Strings, or via standard
parser combinator mechanisms. apply
returns either the error message or
the org.benknoble.ebnf.Grammar in an Either.
From Matt Might's specification
BNF
When describing languages, Backus-Naur form (BNF) is a formal notation for encoding grammars intended for human consumption.
Many programming languages, protocols or formats have a BNF description in their specification.
Every rule in Backus-Naur form has the following structure:
name ::= expansion
The symbol ::=
means "may expand into" and "may be replaced with."
In some texts, a name is also called a non-terminal symbol.
Every name in Backus-Naur form is surrounded by angle brackets, <
>
,
whether it appears on the left- or right-hand side of the rule.
An expansion is an expression containing terminal symbols and non-terminal symbols, joined together by sequencing and choice.
A terminal symbol is a literal like ("+" or "function") or a class of literals (like integer). It must be quoted using single quotes. Any metacharacters may appear within the quotes.
Simply juxtaposing expressions indicates sequencing.
A vertical bar |
indicates choice.
For example, in BNF, the classic expression grammar is:
<expr> ::= <term> "+" <expr> | <term> <term> ::= <factor> "*" <term> | <factor> <factor> ::= "(" <expr> ")" | <const> <const> ::= integer
EBNF
Extended Backus-Naur form (EBNF) is a collection of extensions to Backus-Naur form.
More important than the minor syntactic differences between the forms of EBNF are the additional operations it allows in expansions.
Option
In EBNF, square brackets around an expansion, [ expansion ]
, indicates
that this expansion is optional.
For example, the rule:
<term> ::= [ "-" ] <factor>
allows factors to be negated.
Repetition
In EBNF, curly braces indicate that the expression may be repeated zero or more times.
For example, the rule:
<args> ::= <arg> { "," <arg> }
defines a conventional comma-separated argument list.
Grouping
To indicate precedence, EBNF grammars may use parentheses, ()
, to
explictly define the order of expansion.
For example, the rule:
<expr> ::= <term> ("+" | "-") <expr>
defines an expression form that allows both addition and subtraction.
Extensions
This version of EBNF admits a "comment-like" extension syntax: a #
escapes
the rest of the line, such that it is not parsed at all. Indeed, it is not
kept in the grammar object at all, so the result of formatting loses the
comments (considered a feature: it cleans the output for consumption by
another tool).
The following grammar from the tests is thus valid:
# this is a comment <A> ::= 'a' # a values | 'b' # b values | 'c' # c values ;
- Annotations
- @JSExportTopLevel( "EbnfParser" )
- Alphabetic
- By Inheritance
- EbnfParser
- RegexParsers
- Parsers
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Type Members
-
type
Elem = Char
- Definition Classes
- RegexParsers → Parsers
-
case class
Error extends NoSuccess with Product with Serializable
- Definition Classes
- Parsers
-
case class
Failure extends NoSuccess with Product with Serializable
- Definition Classes
- Parsers
-
type
Input = Reader[Elem]
- Definition Classes
- Parsers
-
sealed abstract
class
NoSuccess extends ParseResult[Nothing]
- Definition Classes
- Parsers
-
trait
OnceParser[+T] extends Parser[T]
- Definition Classes
- Parsers
-
sealed abstract
class
ParseResult[+T] extends AnyRef
- Definition Classes
- Parsers
-
abstract
class
Parser[+T] extends (Input) ⇒ ParseResult[T]
- Definition Classes
- Parsers
-
case class
Success[+T] extends ParseResult[T] with Product with Serializable
- Definition Classes
- Parsers
-
case class
~[+a, +b] extends Product with Serializable
- Definition Classes
- Parsers
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
OnceParser[T](f: (Input) ⇒ ParseResult[T]): Parser[T] with OnceParser[T]
- Definition Classes
- Parsers
-
def
Parser[T](f: (Input) ⇒ ParseResult[T]): Parser[T]
- Definition Classes
- Parsers
-
def
accept[U](expected: String, f: PartialFunction[Elem, U]): Parser[U]
- Definition Classes
- Parsers
-
def
accept[ES](es: ES)(implicit f: (ES) ⇒ List[Elem]): Parser[List[Elem]]
- Definition Classes
- Parsers
-
implicit
def
accept(e: Elem): Parser[Elem]
- Definition Classes
- Parsers
-
def
acceptIf(p: (Elem) ⇒ Boolean)(err: (Elem) ⇒ String): Parser[Elem]
- Definition Classes
- Parsers
-
def
acceptMatch[U](expected: String, f: PartialFunction[Elem, U]): Parser[U]
- Definition Classes
- Parsers
-
def
acceptSeq[ES](es: ES)(implicit f: (ES) ⇒ Iterable[Elem]): Parser[List[Elem]]
- Definition Classes
- Parsers
-
def
alternation: Parser[Expr]
Parser for an alternation
Parser for an alternation
Top level of stratified gramamr: basically repeated sequences separated by pipes
-
def
apply(input: String): Either[String, Grammar]
Parses a grammar from a String
Parses a grammar from a String
A fun trick is
println(EbnfParser(grammar).map(_.format))
- returns
Either the error message or the grammar
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
chainl1[T, U](first: ⇒ Parser[T], p: ⇒ Parser[U], q: ⇒ Parser[(T, U) ⇒ T]): Parser[T]
- Definition Classes
- Parsers
-
def
chainl1[T](p: ⇒ Parser[T], q: ⇒ Parser[(T, T) ⇒ T]): Parser[T]
- Definition Classes
- Parsers
-
def
chainr1[T, U](p: ⇒ Parser[T], q: ⇒ Parser[(T, U) ⇒ U], combine: (T, U) ⇒ U, first: U): Parser[U]
- Definition Classes
- Parsers
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )
-
val
commentPrefix: String
- Attributes
- protected
-
def
commit[T](p: ⇒ Parser[T]): Parser[T]
- Definition Classes
- Parsers
-
def
elem(e: Elem): Parser[Elem]
- Definition Classes
- Parsers
-
def
elem(kind: String, p: (Elem) ⇒ Boolean): Parser[Elem]
- Definition Classes
- Parsers
-
def
epsilon: Parser[Expr]
Parser for ε
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
err(msg: String): Parser[Nothing]
- Definition Classes
- Parsers
-
def
exp: Parser[Expr]
Parser for top-level expression
-
def
failure(msg: String): Parser[Nothing]
- Definition Classes
- Parsers
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
def
goesTo: Parser[Any]
Parser for
::=
-
def
grammar: Parser[Grammar]
Parser for grammar
-
def
group: Parser[Expr]
Parser for parenthesized groups
-
def
guard[T](p: ⇒ Parser[T]): Parser[T]
- Definition Classes
- Parsers
-
def
handleWhiteSpace(source: CharSequence, offset: Int): Int
- Attributes
- protected
- Definition Classes
- RegexParsers
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
implicit
def
literal(s: String): Parser[String]
- Definition Classes
- RegexParsers
-
def
log[T](p: ⇒ Parser[T])(name: String): Parser[T]
- Definition Classes
- Parsers
-
def
mkList[T]: (~[T, List[T]]) ⇒ List[T]
- Definition Classes
- Parsers
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
nonterminal: Parser[Nonterminal]
Parser for nonterminals
-
def
not[T](p: ⇒ Parser[T]): Parser[Unit]
- Definition Classes
- Parsers
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
def
opt: Parser[Expr]
Parser for options
-
def
opt[T](p: ⇒ Parser[T]): Parser[scala.Option[T]]
- Definition Classes
- Parsers
-
def
parse[T](p: Parser[T], in: Reader): ParseResult[T]
- Definition Classes
- RegexParsers
-
def
parse[T](p: Parser[T], in: CharSequence): ParseResult[T]
- Definition Classes
- RegexParsers
-
def
parse[T](p: Parser[T], in: Reader[Char]): ParseResult[T]
- Definition Classes
- RegexParsers
-
def
parseAll[T](p: Parser[T], in: CharSequence): ParseResult[T]
- Definition Classes
- RegexParsers
-
def
parseAll[T](p: Parser[T], in: Reader): ParseResult[T]
- Definition Classes
- RegexParsers
-
def
parseAll[T](p: Parser[T], in: Reader[Char]): ParseResult[T]
- Definition Classes
- RegexParsers
-
def
parseJS_format(input: String): String
- Attributes
- protected
- Annotations
- @JSExport()
-
def
parseJS_grammar(input: String): Grammar
- Attributes
- protected
- Annotations
- @JSExport()
-
def
parseJS_scala(input: String): String
- Attributes
- protected
- Annotations
- @JSExport()
-
def
phrase[T](p: Parser[T]): Parser[T]
- Definition Classes
- RegexParsers → Parsers
-
def
positioned[T <: Positional](p: ⇒ Parser[T]): Parser[T]
- Definition Classes
- RegexParsers → Parsers
-
implicit
def
regex(r: Regex): Parser[String]
- Definition Classes
- RegexParsers
-
def
rep[T](p: ⇒ Parser[T]): Parser[List[T]]
- Definition Classes
- Parsers
-
def
rep1[T](first: ⇒ Parser[T], p0: ⇒ Parser[T]): Parser[List[T]]
- Definition Classes
- Parsers
- Annotations
- @migration
- Migration
(Changed in version 2.9.0) The
p0
call-by-name arguments is evaluated at most once per constructed Parser object, instead of on every need that arises during parsing.
-
def
rep1[T](p: ⇒ Parser[T]): Parser[List[T]]
- Definition Classes
- Parsers
-
def
rep1sep[T](p: ⇒ Parser[T], q: ⇒ Parser[Any]): Parser[List[T]]
- Definition Classes
- Parsers
-
def
repN[T](num: Int, p: ⇒ Parser[T]): Parser[List[T]]
- Definition Classes
- Parsers
-
def
repetition: Parser[Expr]
Parser for repetition
-
def
repsep[T](p: ⇒ Parser[T], q: ⇒ Parser[Any]): Parser[List[T]]
- Definition Classes
- Parsers
-
def
root: Parser[Grammar]
Parser for top-level Gramamr
Parser for top-level Gramamr
Considers the entire input as a grammar, failing otherwise
-
def
rule: Parser[Production]
Parser for productions
-
def
sequence: Parser[Expr]
Parser for a sequence of expressions
Parser for a sequence of expressions
Anything but an alternation
-
def
skipWhitespace: Boolean
- Definition Classes
- RegexParsers
-
def
success[T](v: T): Parser[T]
- Definition Classes
- Parsers
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
terminal: Parser[Expr]
Parser for terminals
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )
-
val
whiteSpace: Regex
- Attributes
- protected
- Definition Classes
- EbnfParser → RegexParsers
-
object
NoSuccess
- Definition Classes
- Parsers