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.

Reply via email to