45 lines
1.3 KiB
BNF
45 lines
1.3 KiB
BNF
string: '`' {.} '`' | '"' {.} '"';
|
|
|
|
_bin_digit: '0' - '1';
|
|
_oct_digit: _bin_digit | '2' - '7';
|
|
_dec_digit: _oct_digit | '8' - '9';
|
|
_hex_digit: _dec_digit | 'A' - 'F' | 'a' - 'f';
|
|
number: ['-' | '+'] '0' 'b' _bin_digit {_bin_digit | '_'}
|
|
| ['-' | '+'] '0' 'o' _oct_digit {_oct_digit | '_'}
|
|
| ['-' | '+'] _dec_digit {_dec_digit | '_'}
|
|
| ['-' | '+'] '0' 'x' _hex_digit {_hex_digit | '_'};
|
|
|
|
_name_initial: 'A' - 'Z' | 'a' - 'z' | '_' | '~' | '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '-' | '_' | '+' | '=' | '?' | '/' | '.' | '\'';
|
|
_name_char: _name_initial | _dec_digit;
|
|
name: _name_initial {_name_char};
|
|
|
|
!whitespace: ' ' | '\t' | '\n' | '\r';
|
|
!comment: ';' {.} '\n';
|
|
|
|
<<
|
|
import (
|
|
"azalea/schema/ast"
|
|
"azalea/schema/token"
|
|
)
|
|
>>
|
|
Schema: ExprList;
|
|
ExprList
|
|
: Expr <<ast.NewExprList($0)>>
|
|
| ExprList Expr <<ast.AppendExpr($0, $1)>>
|
|
;
|
|
ValList
|
|
: Val <<ast.NewValList($0)>>
|
|
| ValList Val <<ast.AppendVal($0, $1)>>
|
|
;
|
|
Val
|
|
: string <<ast.NewStringVal($T0)>>
|
|
| number <<ast.NewNumberVal($T0)>>
|
|
| name <<ast.NewNameVal($T0)>>
|
|
| Expr <<ast.NewExprVal($0)>>
|
|
;
|
|
Expr
|
|
: "(" name Val Val ")" <<ast.NewExpr($T1, $2, $3)>>
|
|
| "(" name Val ")" <<ast.NewExpr($T1, $2, nil)>>
|
|
| "(" name ")" <<ast.NewExpr($T1, nil, nil)>>
|
|
| "(" "." ValList ")" <<ast.ListExpr($2)>>
|
|
; |