treerack/syntax.parser

67 lines
2.0 KiB
Plaintext
Raw Normal View History

2017-06-25 17:51:08 +02:00
ws:alias = " " | "\t" | "\n" | "\b" | "\f" | "\r" | "\v";
wsc:alias = ws | comment;
block-comment:alias = "/*" ("*" [^/] | [^*])* "*/";
line-comment:alias = "//" [^\n]*;
comment-segment:alias = line-comment | block-comment;
ws-no-nl:alias = " " | "\t" | "\b" | "\f" | "\r" | "\v";
comment = comment-segment (ws-no-nl* "\n"? ws-no-nl* comment-segment)*;
any-char = "."; // equivalent to [^]
// caution: newline is accepted
class-not = "^";
class-char = [^\\\[\]\^\-] | "\\" .;
char-range = class-char "-" class-char;
char-class = "[" class-not? (class-char | char-range)* "]";
2017-06-26 02:20:23 +02:00
// newline is accepted
2017-06-25 17:51:08 +02:00
sequence-char = [^\\"] | "\\" .;
char-sequence = "\"" sequence-char* "\"";
terminal:alias = any-char | char-class | char-sequence;
symbol = [^\\ \n\t\b\f\r\v/.\[\]\"{}\^+*?|():=;]+;
group:alias = "(" wsc* expression wsc* ")";
number:alias = [0-9]+;
count = number;
count-quantifier = "{" wsc* count wsc* "}";
range-from = number;
range-to = number;
range-quantifier = "{" wsc* range-from? wsc* "," wsc* range-to? wsc* "}";
one-or-more = "+";
zero-or-more = "*";
zero-or-one = "?";
quantity:alias = count-quantifier
| range-quantifier
| one-or-more
| zero-or-more
| zero-or-one;
2017-06-25 23:38:32 +02:00
item = (terminal | symbol | group) quantity?;
2017-06-26 02:20:23 +02:00
sequence = item (wsc* item)*;
2017-06-25 17:51:08 +02:00
2017-06-25 23:38:32 +02:00
element:alias = terminal | symbol | group | sequence;
2017-06-25 17:51:08 +02:00
2017-06-26 02:20:23 +02:00
// DOC: how the order matters
2017-06-25 23:38:32 +02:00
choice = element (wsc* "|" wsc* element)+;
2017-06-25 17:51:08 +02:00
// DOC: not having 'not' needs some tricks sometimes
expression:alias = terminal
| symbol
| group
| sequence
| choice;
alias = "alias";
doc = "doc";
root = "root";
flag:alias = alias | doc | root;
definition = symbol (":" flag)* wsc* "=" wsc* expression;
definitions:alias = definition (wsc* ";" (wsc | ";")* definition)*;
syntax:root = (wsc | ";")* definitions? (wsc | ";")*;