Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save mkholodnyak/4c6486374a5bd024a50e59dc5f42cb00 to your computer and use it in GitHub Desktop.
Save mkholodnyak/4c6486374a5bd024a50e59dc5f42cb00 to your computer and use it in GitHub Desktop.
Yate Grammar
module ::= block
block ::= ( import | include | template | function_ | key | var_ | block_expr )*
body ::= '{' block '}' | '[' block ']'
import ::= 'import' inline_string
include ::= 'include' inline_string
template ::= 'match' jpath ( '|' jpath )* template_mode? arglist? body
template_mode ::= QNAME
arglist ::= '(' arglist_item ( ',' arglist_item )* ')'
arglist_item ::= ( 'nodeset', 'boolean', 'scalar' )? QNAME ( '=' inline_expr )?
function_ ::= 'func' QNAME arglist body
external ::= 'external' typedef QNAME argtypes
argtypes ::= '(' ( typedef ( ',' typedef )* )? ')'
key ::= 'key' QNAME '(' inline_expr ',' inline_expr ')' body
var_ ::= QNAME '=' block_expr
block_expr ::= if_ | for_ | apply | attr | xml_line | array | object | pair | subexpr
if_ ::= 'if' multiline_expr body else_if* else_?
else_if ::= 'else if' multiline_expr body
for_ := 'for' multiline_expr body
apply := 'apply' ( inline_expr | array | object ) template_mode? callargs?
callargs := '(' ( callarg ( ',' callarg )* )? ')'
callarg := object | array | multiline_expr
attr := '@' QNAME ( '=' | '+=' ) block_expr
array := '[' block ']'
object := '{' block '}'
pair := inline_expr ':' block_expr
subexpr := '(' block ')'
xml_line := (xml_full | xml_empty | xml_start | xml_end)+
xml_full := xml_start ( xml_full | xml_empty | xml_text )* xml_end
xml_start := '<' QNAME ( xml_attrs )? '>'
xml_empty := '<' QNAME ( xml_attrs )? '/>'
xml_end := '</' QNAME '>'
xml_text := string_content
xml_attrs := xml_attr*
xml_attr := QNAME ( ':' QNAME )? '=' inline_string
inline_expr := inline_or
inline_or := inline_and ( '||' inline_or )?
inline_and := inline_eq ( '&&' inline_and )?
inline_eq := inline_rel ( ( '==' | '!=' ) inline_rel )?
inline_rel := inline_add ( ( '<=' | '<' | '>=' | '>' ) inline_add )?
inline_add := inline_mul ( ( '+' | '-' ) inline_add )?
inline_mul := inline_unary ( ( '/' | '*' | '%' ) inline_mul )?
inline_unary := '-' inline_not | inline_not
inline_not := '!' inline_union | inline_union
inline_union := inline_primary ( '|' inline_union )?
inline_primary := inline_number | inline_string | inline_subexpr | jpath | inline_function | inline_var
inline_number := NUMBER
inline_string := '"' string_content '"'
inline_subexpr := '(' inline_expr ')'
inline_var := QNAME
inline_function := QNAME callargs
jpath := '/'? jpath_steps
jpath_steps := jpath_step*
jpath_step := jpath_dots | jpath_nametest | jpath_predicate
jpath_parents := '.'+
jpath_nametest := '.' ( QNAME | '*' )
jpath_predicate := '[' multiline_expr ']'
cdata := ':::' strings ':::'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment