grammar Squaak::Grammar is HLL::Grammar;
token begin_TOP { <?> }
token TOP { <.begin_TOP> <statementlist> [ $ || <.panic: "Syntax error"> ] }
## Lexer items
# This <ws> rule treats # as "comment to eol". token ws { <!ww> [ '#' \N* \n? | \s+ ]* }
## Statements
rule statementlist { <stat_or_def>* }
rule stat_or_def { | <statement> | <sub_definition> }
rule sub_definition { 'sub' <identifier> <parameters> <statement>* 'end' }
rule parameters { '(' [<identifier> ** ',']? ')' }
proto rule statement { <...> }
rule statement:sym<assignment> { <primary> '=' <EXPR> }
rule statement:sym<do> { <sym> <block> 'end' }
rule statement:sym<for> { <sym> <for_init> ',' <EXPR> <step>? 'do' <statement>* 'end' }
rule step { ',' <EXPR> }
rule for_init { 'var' <identifier> '=' <EXPR> }
rule statement:sym<if> { <sym> <EXPR> 'then' $<then>=<block> ['else' $<else>=<block> ]? 'end' }
rule statement:sym<sub_call> { <primary> }
rule arguments { '(' [<EXPR> ** ',']? ')' }
rule statement:sym<throw> { <sym> <EXPR> }
rule statement:sym<try> { <sym> $<try>=<block> 'catch' <exception> $<catch>=<block> 'end' }
rule exception { <identifier> }
rule statement:sym<var> { <sym> <identifier> ['=' <EXPR>]? }
rule statement:sym<while> { <sym> <EXPR> 'do' <block> 'end' }
rule statement:sym<return> { <sym> <EXPR> }
token begin_block { <?> }
rule block { <.begin_block> <statement>* }
## Terms
rule primary { <identifier> <postfix_expression>* }
proto rule postfix_expression { <...> }
rule postfix_expression:sym<index> { '[' <EXPR> ']' }
rule postfix_expression:sym<key> { '{' <EXPR> '}' }
rule postfix_expression:sym<member> { '.' <identifier> }
rule postfix_expression:sym<call> { <arguments> }
token identifier { <!keyword> <ident> }
token keyword { ['and'|'catch' |'do' |'else' |'end'|'for'|'if' |'not' |'or' |'return'|'sub'|'throw'|'try'|'var'|'while']>> }
token term:sym<integer_constant> { <integer> } token term:sym<string_constant> { <string_constant> } token string_constant { <quote> } token term:sym<float_constant_long> { # longer to work-around lack of LTM [ | \d+ '.' \d* | \d* '.' \d+ ] } token term:sym<primary> { <primary> }
proto token quote { <...> } token quote:sym<'> { <?[']> <quote_EXPR: ':q'> } token quote:sym<"> { <?["]> <quote_EXPR: ':qq'> }
## Operators
INIT { Squaak::Grammar.O(':prec<w>, :assoc<unary>', '%unary-negate'); Squaak::Grammar.O(':prec<v>, :assoc<unary>', '%unary-not'); Squaak::Grammar.O(':prec<u>, :assoc<left>', '%multiplicative'); Squaak::Grammar.O(':prec<t>, :assoc<left>', '%additive'); Squaak::Grammar.O(':prec<s>, :assoc<left>', '%relational'); Squaak::Grammar.O(':prec<r>, :assoc<left>', '%conjunction'); Squaak::Grammar.O(':prec<q>, :assoc<left>', '%disjunction'); }
token circumfix:sym<( )> { '(' <.ws> <EXPR> ')' }
rule circumfix:sym<[ ]> { '[' [<EXPR> ** ',']? ']' }
rule circumfix:sym<{ }> { '{' [<named_field> ** ',']? '}' }
rule named_field { <string_constant> '=>' <EXPR> }
token prefix:sym<-> { <sym> <O('%unary-negate, :pirop<neg>')> } token prefix:sym<not> { <sym> <O('%unary-not, :pirop<isfalse>')> }
token infix:sym<*> { <sym> <O('%multiplicative, :pirop<mul>')> } token infix:sym<%> { <sym> <O('%multiplicative, :pirop<mod>')> } token infix:sym</> { <sym> <O('%multiplicative, :pirop<div>')> }
token infix:sym<+> { <sym> <O('%additive, :pirop<add>')> } token infix:sym<-> { <sym> <O('%additive, :pirop<sub>')> } token infix:sym<..> { <sym> <O('%additive, :pirop<concat>')> }
token infix:sym«<» { <sym> <O('%relational, :pirop<islt iPP>')> } token infix:sym«<=» { <sym> <O('%relational, :pirop<isle iPP>')> } token infix:sym«>» { <sym> <O('%relational, :pirop<isgt iPP>')> } token infix:sym«>=» { <sym> <O('%relational, :pirop<isge iPP>')> } token infix:sym«==» { <sym> <O('%relational, :pirop<iseq iPP>')> } token infix:sym«!=» { <sym> <O('%relational, :pirop<isne iPP>')> }
token infix:sym<and> { <sym> <O('%conjunction, :pasttype<if>')> } token infix:sym<or> { <sym> <O('%disjunction, :pasttype<unless>')> }
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 202:
Non-ASCII character seen before =encoding in 'infix:sym«<»'. Assuming UTF-8