packages feed

rtk-0.11: test-grammars/grammar.pg

grammar 'Grammar';

/*
Section of Haskell imports. Would go to the source code directly
*/

imports """
import Data.List
import qualified Data.Map as M
"""

/*
Grammar rules section. These rules are started with capital letter
*/

/* a */

Grammar = 'grammar' StrLit ';' ImportsOpt RuleList ;

ImportsOpt = ('imports' bigstr)? ;

RuleList = Rule *;

@shortcuts(r)
Rule = OptionList Rule1
     | ,Rule1 ;

Rule: Rule1 = Name '=' Clause ';' 
            | Name ':' Name '=' Clause ';'
            | Name '.' Name ':' Name '=' Clause ';'
            | '.' Name ':' Name '=' Clause ';' ;

OptionList = Option+ ;

Option = '@shortcuts' '(' IdList ')' | '@symmacro' ;

IdList = Name* ~ ',' ;

@shortcuts(cl)
Clause = Clause '|' Clause2
         | ,Clause2;

Clause: Clause2 = Clause2 Clause3
                  | ,Clause3 ;

Clause: Clause3 = ',' Clause4 
                | '!' Clause4
                | ,Clause4 ;

Clause: Clause4 = Clause5 '*' OptDelim
                | Clause5 '+' OptDelim
                | Clause5 '?'
                | ,Clause5 ;

Clause: Clause5 = '(' ,Clause ')'
                | Name
                | StrLit
                | '.'
                | regexplit ;

OptDelim = ('~' Clause5)? ;

StrLit = str ;
Name = id ;

/*
Lexical rules section. These rules are started with regular letter
*/

id = [a-zA-Z][A-Za-z0-9_]* ;
str = '\'' ([^'] | '\\\'')* '\'' ;
@symmacro
dq = '"' ; # production would not be generated for symmacro
@symmacro
ndq = [^"] ;
bigstr = dq dq dq (ndq|dq ndq| dq dq ndq |[\n])* dq dq dq;
regexplit = '[' ([^\]] | '\\]')* ']' ;
Ignore: ws = [ \t\n]+ ;
Ignore: comment = '#' .* [\n] ;
Ignore: comment1 = '/*' ([^\*]|[\*][^\/]|[\n])* '*/';