Implicit Lifting
At its core, DaeDaLus has three semantics categories:
semantic values (names start with a lower case letter),
character classes (names start with
$), andparsers (names start with an upper case letter).
Various language constructs have expectations about the kinds of entities they would be used with. For example:
the operator
+expects two semantic values;the construct
$[ ]expects a character class;the construct
Manyexpects a parser.
DaeDaLus allows more flexible expressions where language constructs and declarations may be used with arguments that do not exactly match the expected categories, subject to the following conversions:
From |
Context |
Effect |
Value |
Char Class |
|
Value |
Parser |
|
Char Class |
Value |
Not allowed |
Char Class |
Parser |
|
In addition to these conversions, DaeDaLus also allows using parsers in
contexts where semantic values are expected, as long as the overall expression
was already a parser. For example, while + normally expects two semantic
values, we also allow expressions like P + Q where + is used with two
parsers as arguments.
The meaning of such expressions is that we first execute the parsers
in left-to-right order, and then apply the function to their results.
For example, P + Q is exactly equivalent to the following parser:
block
let x = P
let y = Q
^ (x + y)