[ This is off the top of my head and untested. ] SubLevelOptions, despite its name, only allows for one sublevel option. You perhaps want something more like:
SublevelOptionsMaybe ::= SublevelOptions SubLevelOptions ::= SubLevelOption+ SublevelOptionsMaybe ::= SublevelOption ::= SUBLEVELOPTIONS There are alternative ways to write the above that are more elegant and probably better, but I think it conveys the idea. Again, untested. I hope this helps, jeffrey On Mon, Feb 19, 2018 at 11:49 AM, <[email protected]> wrote: > I'm scarcely more than a novice with Marpa, so please forgive me if I'm > asking for too much or being naive. > > A sample of my legacy DSL looks like this: > > sublevel: -only "-R[SUNLF]{0,1}\d+\s" -testargsmore -foo > > { > > < test { foo } > > > } > > > The *sublevel:* is supposed to be a key word, introducing a kind of > statement. > > Following the key word is a bunch of nearly arbitrary text (containing > options and parameters), terminated by a {}-delimited body. So the overall > structure is this: > > *sublevel:* *<options>* > *{* > *<more statements>* > *}* > > > So, the open curly signals the end of the *<options>* and the start of > the body. > > This legacy DSL allows curlies inside the *<options>* provided they are > quoted (single or double) or escaped. So, the curlies in *{0,1}* should > not be interpreted as special, but taken verbatim. > > I studied the string grammar listed in https://gist.github.com/ > jddurand/8d3238c22731a85eb890 and used it as a guide for my development > for the grammar I list below. In particular, that example taught me that > L0 rules permit alternative productions, and also allow sequences. Anyway, > the portion of the grammar in ALL CAPS was derived from that example. > > But, I get this "No lexeme" error when it hits the first dquote, and I > cannot figure out why! > > Setting trace_terminals option > Setting trace_values option > Discarded lexeme L1c1: whitespace > Accepted lexeme L2c1-9 e1: 'sublevel:'; value="sublevel:" > Accepted lexeme L2c1-9 e1: 'sublevel:'; value="sublevel:" > Accepted lexeme L2c10-16 e2: SUBLEVELOPTIONS; value=" -only " > ****** FAILED TO PARSE ****** > MSG: > Error in SLIF parse: No lexeme found at line 2, column 17 > * String before error: \nsublevel: -only\s > * The error was at line 2, column 17, and at character 0x0022 '"', ... > * here: "-R[SUNLF]{0,1}\\d+\\s" -testargsmore -foo\n{\n < > Marpa::R2 exception at ./marpa_bnf_1.pl line 31. > > > I would be grateful for any insights. > > I intended that my sample input would have been interpreted, at some depth > of productions, as > > *sublevel:* *SublevelOptions* > *{* > * NamedBlockList* > *}* > > > and I thought that the SublevelOptions > > -only "-R[SUNLF]{0,1}\d+\s" -testargsmore -foo > > would decompose into > > STRING_UNQUOTED = ( -only ) > STRING_DQUOTED = ("-R[SUNLF]{0,1}\d+\s") > STRING_UNQUOTED = ( -testargsmore -foo) > > > and I failed to see why it doesn't do so. Instead, Marpa tells me it > doesn't know what to do when it sees that dquote. > > Below is my full grammar. > > :default ::= action => [name, start, length, values] > lexeme default = latm => 1 > > File ::= BodyStatements > File ::= > > BodyStatements ::= BodyStatement+ > > BodyStatement ::= > Sublevel > | SingleTest > > > Sublevel ::= ('sublevel:') SublevelOptionsMaybe ('{') BodyStatements ('}') > Sublevel ::= ('sublevel:') SublevelOptionsMaybe ('{') ('}') > SublevelOptionsMaybe ::= SublevelOptions > SublevelOptionsMaybe ::= > > SublevelOptions ::= SUBLEVELOPTIONS > > SUBLEVELOPTIONS ~ SUBLEVELOPTIONS_STRING+ > > SUBLEVELOPTIONS_STRING ~ STRING_UNQUOTED > | STRING_SQUOTED > | STRING_DQUOTED > > STRING_UNQUOTED ~ CHAR_UNQUOTED+ > CHAR_UNQUOTED ~ [^"'\}\{;\\\n] > CHAR_UNQUOTED ~ ES > > STRING_SQUOTED ~ SQUOTE STRING_INSIDE_SQUOTES SQUOTE > STRING_INSIDE_SQUOTES ~ CHAR_INSIDE_SQUOTES* > CHAR_INSIDE_SQUOTES ~ [^'\\] > CHAR_INSIDE_SQUOTES ~ [\\] ['] > SQUOTE ~ ['] > > STRING_DQUOTED ~ DQUOTE STRING_INSIDE_DQUOTES DQUOTE > STRING_INSIDE_DQUOTES ~ CHAR_INSIDE_DQUOTES* > CHAR_INSIDE_DQUOTES ~ [^"\\\n] > CHAR_INSIDE_DQUOTES ~ [\\] [^#] > DQUOTE ~ ["] > > ES ~ [\\] [\\'"\{\};] > > NamedBlockList ::= NamedBlock+ > NamedBlock ::= ArgTag ('{') ArgBodyMaybe ('}') > ArgBodyMaybe ::= ArgBody > ArgBodyMaybe ::= > ArgBody ~ [^\{\}]+ > ArgTag ~ [\w]+ > > SingleTest ::= > SingleSimpleTest > > SingleSimpleTest ::= ('<') NamedBlockList ('>') > > # whitespace > :discard ~ whitespace > whitespace ~ [\s]+ > > > > > -- > You received this message because you are subscribed to the Google Groups > "marpa parser" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "marpa parser" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
