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])* '*/';