haldis/app/hlds/hlds.tatsu
Midgard d0699b3716
HLDS: change :: to double space and require it
Require double space before tags and price, like in the plain text
accounting format of ledger. This makes it easier to differentiate
between prices mentioned in descriptions and the price for the dish.
2021-06-20 23:57:50 +02:00

89 lines
1.7 KiB
Text

# This is a Tatsu file.
# Syntax is explained at
# https://tatsu.readthedocs.io/en/stable/syntax.html
@@grammar :: Hlds
# Don't ignore any whitespace
@@whitespace :: //
@@eol_comments :: /[ \t]*#.*?$/
@@keyword :: single_choice multi_choice dish preset only requires except
start = [n] { @+:location } $ ;
location_header =
/={3,}/ n ~
id:identifier ':' s name:string
attributes:{ location_attribute }
[ n ]
/={3,}\n+/
;
location_attribute =
n '\t' key:identifier s value:string
;
location = >location_header items:{ block } ;
attributes =
name:/[^\n#]*?(?= +-- | | *\n| *#)/
[ s '--' ~ s description:/[^\n#]*?(?= | *\n| *#)/ ]
[ / {2,}/ ~
[ {[ s ] ('{' tags+:identifier '}')} / +|$/ ]
[ price:price ]
]
;
block =
| dish_block
| choice_block
;
dish_block =
'dish' s ~
id:identifier ':' s >attributes
n
choices:{ indent_choice_block }
;
choice_entry = id:identifier ':' s >attributes ;
noindent_choice_entry = n '\t' >choice_entry ;
indent_choice_entry = n '\t\t' >choice_entry ;
# Toplevel choice definitions
choice_block =
id:identifier ':' s >attributes entries:{ noindent_choice_entry }
n
;
# Appears in a dish block. One of:
# 1) reference to toplevel choice definition
# 2) inline choice declaration (as opposed to globally declared and referenced)
indent_choice_block =
'\t' type:choice_type s
(
| kind:`declaration` id:identifier ':' ~ s >attributes entries:{ indent_choice_entry }
| kind:`reference` id:identifier [ s price:price ]
)
n
;
s = / +/ ;
n = '\n' {{'\t'} '\n'} ;
@name
identifier = /[a-z0-9_-]+/ ;
string = /[^\n#]+/ ;
choice_type = 'single_choice' | 'multi_choice' ;
int = /[0-9]+/ ;
currency = '€' ;
price = currency:currency s value_unit:int [ '.' value_cents:/[0-9]{,2}/ ] ;