products/sources/formale Sprachen/VDM/VDMSL/VCParser-masterSL image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei: README.txt   Sprache: Unknown

Spracherkennung für: .md vermutete Sprache: Lex {Lex[49] Fortran[85] Abap[92]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

VCParser
========

A little combinatory parser in VDM-SL

Basics
-------
Here I introduce how to use VCParser by writing a binary number parser.

* To create a parser that accepts only '0' (a character),
~~~~~
zero = takeChar('0')
~~~~~
will take a string (seq of char, in VDM-SL) and returns a PARSED value, for example,
~~~~~
zero("011")
~~~~~
will return
~~~~~
mk_PARSED(mk_TREE(nil, "0"), "11")
~~~~~
which says it parsed the input into a tree of "0" and "110" is remained.
If failed,
~~~~~
zero("101")
~~~~~
will result in
~~~~~
mk_PARSED(mk_ERROR("Expected '0'"), "101")
~~~~~
which says it couldn't parse the input and "1001" is remained.

* To create a parser that accepts only "1" (a string),
~~~~~
one = takeString("1")
~~~~~
For example,
~~~~~
one("101")
~~~~~
will return
~~~~~
mk_PARSED(mk_TREE(nil, "1"), "01")
~~~~~

* To create a parser that accepts either 0 or 1 (aka "/"),
~~~~~
bin = either([zero, one])
~~~~~
For example,
~~~~~
mk_(
  bin("101"),
  bin("011")
)
~~~~~
will return
~~~~~
mk_(
  mk_PARSED(mk_TREE(nil, "1"), "01"),
  mk_PARSED(mk_TREE(nil, "0"), "11")
)
~~~~~

* To create a parser that accepts a repeated series of binary digits (aka "*"),
~~~~~
binStar = star(bin)
~~~~~
For example,
~~~~~
mk_(
  binStar("101"),
  binStar("")
)
~~~~~
will return
~~~~~
mk_(
  mk_PARSED(mk_TREE(nil, [mk_TREE(nil, "1"), mk_TREE(nil, "0"), mk_TREE(nil, "1")]), []),
  mk_PARSED(mk_TREE(nil, []), [])
)
~~~~~
Please note that the second value in the result pair is NOT an error.

* To create a parser that accepts a binary digit and then the binStar (aka ","),
~~~~~
binPlus = series([bin, binStar])
~~~~~
For example,
~~~~~
mk_(
  binPlus("1001"),
  binPlus("")
)
~~~~~
will return
~~~~~
mk_(
  mk_PARSED(mk_TREE(nil, [mk_TREE(nil, "1"), mk_TREE(nil, [mk_TREE(nil, "0"), mk_TREE(nil, "1")])]), []), 
  mk_PARSED(mk_ERROR("Unexpected EOF"), [])
)
~~~~~

* To create a parser that optionally accepts "0b" prefix before a series of binary digits (aka "[]"),
~~~~~
binary = series([option(takeString("0b")), binPlus])
~~~~~
For example,
~~~~~
mk_(
  binary("0b10"),
  binary("10"),
  binary("0x10")
)
~~~~~
will return
~~~~~
mk_(
  mk_PARSED(mk_TREE(nil, [mk_TREE(nil, "0b"), mk_TREE(nil, [mk_TREE(nil, "1"), mk_TREE(nil, [mk_TREE(nil, "0")])])]), []),
  mk_PARSED(mk_TREE(nil, [mk_TREE(nil, []), mk_TREE(nil, [mk_TREE(nil, "1"), mk_TREE(nil, [mk_TREE(nil, "0")])])]), []),
  mk_PARSED(mk_TREE(nil, [mk_TREE(nil, []), mk_TREE(nil, [mk_TREE(nil, "0"), mk_TREE(nil, [])])]), "x10")
)
~~~~~

* To create a parser that accepts a binary number trimming blanks around it,
~~~~~
binaryTerm = trimBlanks(binary)
~~~~~
For example,
~~~~~
binaryTerm(" 0b10 1")
~~~~~
will return
~~~~~
mk_PARSED(mk_TREE(nil, [mk_TREE(nil, "0b"), mk_TREE(nil, [mk_TREE(nil, "1"), mk_TREE(nil, [mk_TREE(nil, "0")])])]), "1")
~~~~~

* To obtain a flatten tree from compound parser
~~~~~
flatBinStar = concat(binStar)
~~~~~
For example,
~~~~~
mk_(
  binStar("101"),
  flatBinStar("101")
)
~~~~~
will return
~~~~~
mk_(
  mk_PARSED(mk_TREE(nil, [mk_TREE(nil, "1"), mk_TREE(nil, "0"), mk_TREE(nil, "1")]), []),
  mk_PARSED(mk_TREE(nil, "101"), [])
)
~~~~~

* To change an error message,
~~~~~
bin2 = iferror("Accepts only 0 or 1", bin)
~~~~~
For example,
~~~~~
mk_(
 bin2("101"),
  bin2("210")
)
~~~~~
will return
~~~~~
mk_(
  mk_PARSED(mk_TREE(nil, "1"), "01"), 
  mk_PARSED(mk_ERROR("Accepts only 0 or 1"), "210")
)
~~~~~

* To modify a parsed tree,
~~~~~
translate = transtree(lambda tree:TREE & cases tree:
  mk_TREE(-, "0") -> mk_TREE(nil, "zero"),
  mk_TREE(-, "1") -> mk_TREE(nil, "one") end, bin)
~~~~~
For example,
~~~~~
mk_(
 translate("0"),
  translate("1")
)
~~~~~
will return
~~~~~
mk_(
  mk_PARSED(mk_TREE(nil, "zero"), []),
  mk_PARSED(mk_TREE(nil, "one"), [])
)
~~~~~

There are a bunch of other useful combinators and minimal parsers, such as any, digit, alphabet and so on.
Please read the VCParser.vdmsl for details.

[ Verzeichnis aufwärts0.63unsichere Verbindung  ]