I'm not qualified to speak on Spirits internal architecture; I've only
used it once for something very simple and ran into a one-liner bug
which remains unfixed 7+ years later. But the basic API of Spirit would
be wrong for D. “it is possible to write a highly-integrated
lexer/perser generator in D without resorting to additional tools” does
not mean "the library should allow programmer to write grammar directly
in D (ideally, the syntax should be somehow similar to EBNF)" it means
that the library should allow you to write a grammar in EBNF and then
through a combination of templates, string mixins and compile-time
function evaluation generate the appropriate (hopefully optimal) parser.
D's compile-time programming abilities are strong enough to do the code
generation job usually left to separate tools. Ultimately a user of the
library should be able to declare a parser something like this:

// Declare a parser for Wikipedia's EBNF sample language
Parser!`
(* a simple program syntax in EBNF − Wikipedia *)
program = 'PROGRAM' , white space , identifier , white space ,
            'BEGIN' , white space ,
            { assignment , ";" , white space } ,
            'END.' ;
identifier = alphabetic character , { alphabetic character | digit } ;
number = [ "-" ] , digit , { digit } ;
string = '"' , { all characters − '"' } , '"' ;
assignment = identifier , ":=" , ( number | identifier | string ) ;
alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G"
                      | "H" | "I" | "J" | "K" | "L" | "M" | "N"
                      | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
                      | "V" | "W" | "X" | "Y" | "Z" ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
white space = ? white space characters ? ;
all characters = ? all visible characters ? ;
` wikiLangParser;

Ok, it sounds good. But still in most cases we are not interesting only if input text match specified grammar. We want to perform some semantic actions while parsing, for example build some kind of AST, evaluate an expression and so on. But I have no idea how can I ask this parser to perform user-defined actions for example for 'string' and 'number' "nodes" in this case.


Ilya.

Reply via email to