Okay, I tried that, and it mostly worked! But I don't understand why. I think I may have to study this a bit more - my mental model for marpa's handling of L0 grammar is probably not right.
-stefan On Monday, February 19, 2018 at 10:18:34 PM UTC-5, Stefan Gottschalk's wrote: > > I thought that > > SUBLEVELOPTIONS ~ SUBLEVELOPTIONS_STRING+ > > would cause the input to be chopped up into a series of quoted and > unquoted segments, where the quoted segments were allowed to contain spaces > (see CHAR_INSIDE_SQUOTES and CHAR_INSIDE_DQUOTES), but the unquoted > segments were not (see CHAR_UNQUOTED). > > Anyway, I will give your suggestion a try. > > Thank you! > > -stefan > > > On Monday, February 19, 2018 at 4:34:13 PM UTC-5, Jeffrey Kegler wrote: >> >> [ 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.
