%import common (LETTER, DIGIT, INT, CNAME, SIGNED_NUMBER, NUMBER) _WHITESPACE: /\s+/ STRING: /("(?!"").*?(?${]|\\.)+/s // exclude only the starting ones ?plain_choice: /((?!__|\bAND\b|\${|\$\$)[^\\()\[\]:<>${|}~@]|\\.)+/s // add the specific internal choice ones ?plain_alternate: /((?!__|\bAND\b|\${)[^\\()\[\]:<>${|]|\\.)+/s // add the specific internal alternate ones ?plain_var: /((?!__|\bAND\b|\${)[^\\()\[\]:<>${}]|\\.)+/s // add the specific internal var ones ?specialchars: /[_{()\[\]:<>]|\$(?![{$])/ // include only the starting ones ?specialchars_negtag: /[_{()\[\]:<>!|}]|\$(?![{$])/ // add the internal negtag ones ?specialchars_alternate: /[_{()\[\]:<>|]|\$(?![{$])/ // add the internal alternate ones ?specialchars_choice: /[_{()\[\]:<>|}]|\$(?![{$])/ // add the internal choice ones ?specialchars_var: /[_{()\[\]:<>}]|\$(?![{$])/ // add the internal var ones ?numpar: _WHITESPACE? SIGNED_NUMBER _WHITESPACE? start: prompt negative_sep prompt ?prompt: promptcomp | content negative_sep: /\x1d/ // prompt composition with AND promptcomp.4: promptcomppart ( [ ":" numpar ] ( /\bAND\b/ promptcomppart [ ":" numpar ] )+ )+ promptcomppart: content // simple prompts ?old_content.2: ( attention | scheduled | alternate | extranetworktag )+ //#if ALLOW_NEW_CONTENT ?content.2: ( old_content | new_content | plain | specialchars )* ?content_choice.2: ( old_content | new_content | plain_choice | specialchars_choice )* ?content_var.2: ( old_content | new_content | plain_var | specialchars_var )* ?content_negtag.2: ( old_content | new_content_negtag | plain | specialchars_negtag )* ?content_alternate.2: ( old_content | new_content | plain_alternate | specialchars_alternate )* ?content_en.2: (new_content_en | plain | specialchars )* //#if ALLOW_WILDCARDS and ALLOW_CHOICES and ALLOW_COMMVARS ?new_content.3: ( variableset | variableuse | commandstn | commandstni | commandset | commandecho | commandif | commandext | commandsetwcdeffilter | wildcard | choices )+ ?new_content_negtag.3: ( variableset | variableuse | commandset | commandecho | commandif | commandext | commandsetwcdeffilter | wildcard | choices )+ ?new_content_en.3: ( variableset | variableuse | commandset | commandecho | commandif | choices )+ //#elif ALLOW_WILDCARDS and not ALLOW_CHOICES and ALLOW_COMMVARS ?new_content.3: ( variableset | variableuse | commandstn | commandstni | commandset | commandecho | commandif | commandext | commandsetwcdeffilter | wildcard )+ ?new_content_negtag.3: ( variableset | variableuse | commandset | commandecho | commandif | commandext | commandsetwcdeffilter | wildcard )+ ?new_content_en.3: ( variableset | variableuse | commandset | commandecho | commandif )+ //#elif not ALLOW_WILDCARDS and ALLOW_CHOICES and ALLOW_COMMVARS ?new_content.3: ( variableset | variableuse | commandstn | commandstni | commandset | commandecho | commandif | commandext | choices )+ ?new_content_negtag.3: ( variableset | variableuse | commandset | commandecho | commandif | commandext | choices )+ ?new_content_en.3: ( variableset | variableuse | commandset | commandecho | commandif | choices )+ //#elif ALLOW_WILDCARDS and ALLOW_CHOICES and not ALLOW_COMMVARS ?new_content.3: ( wildcard | choices )+ ?new_content_negtag.3: ( wildcard | choices )+ ?new_content_en.3: ( choices )+ //#elif ALLOW_WILDCARDS and not ALLOW_CHOICES and not ALLOW_COMMVARS ?new_content.3: ( wildcard )+ ?new_content_negtag.3: ( wildcard )+ ?new_content_en.3: /(?!)./ // never matches //#elif not ALLOW_WILDCARDS and ALLOW_CHOICES and not ALLOW_COMMVARS ?new_content.3: ( choices )+ ?new_content_negtag.3: ( choices )+ ?new_content_en.3: ( choices )+ //#elif not ALLOW_WILDCARDS and not ALLOW_CHOICES and ALLOW_COMMVARS ?new_content.3: ( variableset | variableuse | commandstn | commandstni | commandset | commandecho | commandif | commandext )+ ?new_content_negtag.3: ( variableset | variableuse | commandset | commandecho | commandif | commandext )+ ?new_content_en.3: ( variableset | variableuse | commandset | commandecho | commandif )+ //#else ?new_content.3: ( variableset | variableuse | commandstn | commandstni | commandset | commandecho | commandif | commandext | commandsetwcdeffilter | wildcard | choices )+ ?new_content_negtag.3: ( variableset | variableuse | commandset | commandecho | commandif | commandext | commandsetwcdeffilter | wildcard | choices )+ ?new_content_en.3: ( variableset | variableuse | commandset | commandecho | commandif | choices )+ //#endif //#else ?content.2: ( old_content | plain | specialchars )* ?content_choice.2: ( old_content | plain_choice | specialchars_choice )* ?content_var.2: ( old_content | plain_var | specialchars_var )* ?content_negtag.2: ( old_content | plain | specialchars_negtag )* ?content_alternate.2: ( old_content | plain_alternate | specialchars_alternate )* ?content_en.2: (plain | specialchars )* //#endif // attention modifiers attention: ( "(" content [ ":" numpar ] ")" ) | ( "[" content "]" ) // prompt scheduling and alternation alternate: "[" alternateoption ( "|" alternateoption )+ "]" alternateoption: content_alternate scheduled: "[" [ content ":" ] content ":" numpar "]" // extra network tags extranetworktag: "<" /(?!ppp:)\w+:/ encontent ">" ?encontent.3: content_en //#if ALLOW_COMMVARS or ALLOW_CHOICES or ALLOW_WILDCARDS vardescriptor_get.8: VARNAME [ /\[/ [ SIGNED_NUMBER | IDENTIFIER | separator_descriptor | /#/ ] /\]/ ] separator_descriptor: /&/ STRING vardescriptor_set.9: VARNAME [ /\[/ [ SIGNED_NUMBER | IDENTIFIER ] /\]/ ] // conditions ?condition: grouped_condition | ungrouped_condition ?ungrouped_condition: operation | basic_condition ?grouped_condition.8: "(" _WHITESPACE? condition _WHITESPACE? ")" ?basic_condition: comparison | truthy_operand ?operation: operation_not | operation_and | operation_or operation_and: condition _WHITESPACE "and" _WHITESPACE condition operation_or: condition _WHITESPACE "or" _WHITESPACE condition operation_not: "not" ( ( _WHITESPACE ungrouped_condition ) | ( _WHITESPACE? grouped_condition ) ) ?complexvalue: vardescriptor_get | SIMPLEVALUE truthy_operand: vardescriptor_get comparison: ( complexvalue | listvalue ) _WHITESPACE ( /not/ _WHITESPACE )? /eq|ne|lt|gt|le|ge|contains|in|any_in|contains_any/ _WHITESPACE ( complexvalue | listvalue ) listvalue.9: "(" ( _WHITESPACE? complexvalue ( _WHITESPACE? "," _WHITESPACE? complexvalue )* )? _WHITESPACE? ")" //#endif //#if ALLOW_COMMVARS // command: stn (send to negative) commandstn: "" content_negtag "" commandstni: "" | ">" ) // command: if commandif.2: commandif_if commandif_elif* commandif_else? "" commandif_if: "" ifvalue commandif_elif: "" ifvalue commandif_else: "" ifvalue ifvalue.3: content // command: set commandset: "" ( starredvalue | commandsetcontent ) "" commandsetmodifiers: (_WHITESPACE /evaluate|ifundefined|add/ )+ ?commandsetcontent.3: content // variable set //#if ALLOW_WILDCARDS starredvalue.9: "*" ( wildcard | vardescriptor_get | listvalue ) //#else starredvalue.9: "*" ( vardescriptor_get | listvalue ) //#endif variableset.2: "${" _WHITESPACE? vardescriptor_set [ variablesetmodifiers ] _WHITESPACE? "=" [ /!/ ] ( starredvalue | varvalue ) "}" variablesetmodifiers: /[+?!]+/ // command: echo commandecho: "" [ commandechodefault "" ] | "/>" ) ?commandechodefault.3: content // variable use variableuse.2: "${" _WHITESPACE? vardescriptor_get _WHITESPACE? [ ":" varvalue ] "}" // command: ext commandext: "" [ commandexttriggers "" ] | "/>" ) commandexttype: [/\$/] IDENTIFIER ?commandextid.2: STRING | CNAME ?commandextparams.2: STRING | SIGNED_NUMBER ?commandextif: "if" _WHITESPACE condition ?commandexttriggers.3: content //#endif varvalue: content_var //#if ALLOW_CHOICES or ALLOW_WILDCARDS // choices parameters (for choices and wildcards) choicesoptions: [ choicesoptions_sampler ] [ _WHITESPACE? choicesoptions_flags ] [ _WHITESPACE? choicesoptions_range ] [ _WHITESPACE? choicesoptions_sep ] choicesoptions_sampler: /[~@]/ // ~ for random, @ for cyclical choicesoptions_flags: /[ro]{1,2}/ // r for repeating, o for optional choicesoptions_range: INT | ( [ INT ] _WHITESPACE? "-" _WHITESPACE? [ INT ] ) choicesoptions_sep: "$$" plain // choice options choice: [ [ _WHITESPACE? choiceiscmd ] [ _WHITESPACE? choicelabels ] [ _WHITESPACE? choiceweight ] [ _WHITESPACE? choiceif ] _WHITESPACE? "::" ] choicevalue choiceiscmd: /%/ // the option text is a special command choicelabels: /["']/ IDENTIFIER ( _WHITESPACE? "," _WHITESPACE? IDENTIFIER )* /["']/ choiceweight: NUMBER choiceif: "if" _WHITESPACE condition choicevalue: content_choice //#endif //#if ALLOW_CHOICES // choices construct choices.2: "{" [ choicesoptions_sampler | ( choicesoptions _WHITESPACE? "$$" ) ] choice ( "|" choice )* "}" //#endif //#if ALLOW_WILDCARDS // wildcard definition options wcdefoptions: [ choicesoptions_sampler ] [ _WHITESPACE? choicesoptions_flags ] [ _WHITESPACE? choicesoptions_range ] [ _WHITESPACE? wcdescription ] [ _WHITESPACE? choicesoptions_sep ] wcdescription: STRING // wildcards construct wildcard.2: "__" [ choicesoptions_sampler | ( choicesoptions _WHITESPACE? "$$" ) ] wildcard_name [ wc_filter ] [ wildcardvar ] "__" wc_filter_nums: IDENTIFIER | INDEX | (INDEX /-/ INDEX) //#if ALLOW_COMMVARS wildcard_name.2: ( WC_NAME_PLAIN_START | variableuse | commandecho ) ( WC_NAME_PLAIN | variableuse | commandecho )* wc_filter_simple: wc_filter_nums | variableuse //#else wildcard_name.2: ( WC_NAME_PLAIN_START) WC_NAME_PLAIN* wc_filter_simple: wc_filter_nums //#endif wc_filter: /["']/ ( [ /#/ ] wc_filter_or | ( /#?\^/ wildcard_name ) ) /["']/ wc_filter_or: wc_filter_and ( _WHITESPACE? "," _WHITESPACE? wc_filter_and )* wc_filter_and: wc_filter_simple ( _WHITESPACE? "+" _WHITESPACE? wc_filter_simple )* wildcardvar.7: "(" _WHITESPACE? vardescriptor_get _WHITESPACE? "=" varvalue ")" //#if ALLOW_COMMVARS // command: setwcdeffilter commandsetwcdeffilter: "" wc_name_str: /["']/ wildcard_name /["']/ wc_filter_limited: /["']/ wc_filter_or /["']/ //#endif //#endif