Thank you for your input. I think it's a bit more complex. I have the
whole grammar below. It takes 27 seconds for pegjs to generate the grammar
(chrome, faster than IE9). When I replace the 17 expression lines with 1
line the time reduces to 71mS. I wonder whether I am hitting some point on
the complexity curve that is making times increase exponentially?
/* hCode synatx v0.1 */
start = enclosedSequence __
enclosedSequence = beginSymbol sequence endSymbol / beginSymbolQuick
sequence endSymbolQuick
sequence = clause (altSymbol clause)* / clause (altSymbolQuick clause)*
clause = guardedClause / unguardedClause
guardedClause = unguardedClause guardSymbol unguardedClause /
unguardedClause guardSymbolQuick unguardedClause
unguardedClause = phrase (goOnSymbol phrase)*
phrase = expression (andAlsoSymbol expression)*
expression = prio0
/* remove this for timing tests */
prio0 = prio1 prio0op prio0 / prio1
prio1 = prio2 prio1op prio1 / prio2
prio2 = prio3 prio2op prio2 / prio3
prio3 = prio4 prio3op prio3 / prio4
prio4 = prio5 prio4op prio4 / prio5
prio5 = prio6 prio5op prio5 / prio6
prio6 = prio7 prio6op prio6 / prio7
prio7 = prio8 prio7op prio7 / prio8
prio8 = prio9 prio8op prio8 / prio9
prio9 = prioA prio9op prio9 / prioA
prioA = prioB prioAop prioA / prioB
prioB = prioC prioBop prioB / prioC
prioC = prioE prioCop prioC / prioD
prioD = prioE prioDop prioD / prioE
prioE = prioF prioEop prioE / prioF
prioF = prefixed prioFop prioF / prefixed
/* end of remove */
/* add this for timing tests *
prio0 = prefixed prio0op prio0 / prefixed
* end of add */
prefixed = preOp primary / primary
primary = literal / enclosedSequence
/* Constructor */
beginSymbol = "BEGIN"i __
endSymbol = "END"i __
beginSymbolQuick = "(" __
endSymbolQuick = ")" __
altSymbol = "ELSE"i __
altSymbolQuick = "|" __
guardSymbol = "THEN"i __
guardSymbolQuick = "?" __
goOnSymbol = ";" __
andAlsoSymbol = "," __
/* Literal */ /* This section to be completed */
literal
= dummyLiteral
/* Operator */ /* This section to be completed */
preOp = dummyPrefixOperator
prio0op = dummySymbol0
prio1op = dummySymbol1
prio2op = dummySymbol2
prio3op = dummySymbol3
prio4op = dummySymbol4
prio5op = dummySymbol5
prio6op = dummySymbol6
prio7op = dummySymbol7
prio8op = dummySymbol8
prio9op = dummySymbol9
prioAop = dummySymbolA
prioBop = dummySymbolB
prioCop = dummySymbolC
prioDop = dummySymbolD
prioEop = dummySymbolE
prioFop = dummySymbolF
/* Identifier */
identifier = !reservedWord name:identifierName {return name}
identifierName = s:identifierStarter f:identifierFollower* __ { return
ids+idf.join("")}
identifierStarter = [a-zA-Z_]
identifierFollower = (identifierStarter / [0-9])
/* Reserved words, white space, comments
****************************************************************************
/
reservedWord
= beginSymbol
/ endSymbol
/ altSymbol
/ guardSymbol
anyCharacter
= .
EOF
= !.
whiteSpace
= [\t\v\f
\u00A0\uFEFF\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u20
06\u2007\u2008\u2009\u200A\u202F\u205F\u3000]
lineTerminator
= [\n\r\u2028\u2029]
__
= ( whiteSpace / lineTerminator )*
/* temporary placemarkers */
dummySymbol0 = "#0" __
dummySymbol1 = "#1" __
dummySymbol2 = "#2" __
dummySymbol3 = "#3" __
dummySymbol4 = "#4" __
dummySymbol5 = "#5" __
dummySymbol6 = "#6" __
dummySymbol7 = "#7" __
dummySymbol8 = "#8" __
dummySymbol9 = "#9" __
dummySymbolA = "#a" __
dummySymbolB = "#b" __
dummySymbolC = "#c" __
dummySymbolD = "#d" __
dummySymbolE = "#e" __
dummySymbolF = "#f" __
dummyPrefixOperator = "##" __
dummyLiteral = [0-9]+ __
Thanks
John