miller/cmd/experiments/dsl-parser/two/emit01.bnf
John Kerl a977617797
Address some staticcheck issues (#823)
* address some staticcheck issues

* address some staticcheck issues

* address some staticcheck issues

* address some staticcheck issues
2022-01-01 14:28:19 -05:00

103 lines
2.4 KiB
BNF

// ================================================================
// LEXER
!whitespace : ' ' | '\t' | '\n' | '\r' ;
!comment : '#' {.} '\n' ;
_letter : 'a'-'z' | 'A'-'Z' ;
_decdig : '0'-'9' ;
_idchar : _letter | _decdig | '_' ;
emit : 'e' 'm' 'i' 't' ;
// ================================================================
// IMPORT
<< import "miller/src/dsl" >>
// ================================================================
// PARSER
// ----------------------------------------------------------------
Root
: EmitStatement
<< dsl.NewAST($0) >>
;
// ----------------------------------------------------------------
// Examples:
// emit @a
// emit (@a, @b)
// emit @a, "x", "y"
// emit (@a, @b), "x", "y"
// First argument (single or in parentheses) must be non-indexed
// oosvar/localvar/fieldname, so we can use their names as keys in the emitted
// record. These restrictions are enforced in the CST logic, to keep this
// parser/AST logic simpler.
EmitStatement
: emit Rvalue
<< dsl.NewASTNodeUnary($0, $1, dsl.NodeTypeEmitStatement) >>
| emit Rvalue "," EmitArgs
<< dsl.NewASTNodeBinary($0, $1, $3, dsl.NodeTypeEmitStatement) >>
| emit "(" EmitArgs ")"
<< dsl.NewASTNodeUnary($0, $2, dsl.NodeTypeEmitStatement) >>
| emit "(" EmitArgs ")" "," EmitArgs
<< dsl.NewASTNodeBinary($0, $2, $5, dsl.NodeTypeEmitStatement) >>
;
// ----------------------------------------------------------------
EmitArgs
: Rvalue
<< dsl.NewASTNodeUnary(
nil,
$0,
dsl.NodeTypeFunctionCallsite,
) >>
| Rvalue "," EmitArgs
<< dsl.PrependChild(
$2,
$0,
) >>
;
// ----------------------------------------------------------------
FcnArgs
: Rvalue
<< dsl.NewASTNodeUnary(
nil,
$0,
dsl.NodeTypeFunctionCallsite,
) >>
// Allow trailing final comma, especially for multiline statements
| Rvalue ","
<< dsl.NewASTNodeUnary(
nil,
$0,
dsl.NodeTypeFunctionCallsite,
) >>
// Allow trailing final comma, especially for multiline statements
| Rvalue "," FcnArgs
<< dsl.PrependChild(
$2,
$0,
) >>
;
// ----------------------------------------------------------------
Rvalue
: Literal
| "(" Literal ")"
;
Literal
: "x" << dsl.NewASTNodeZary($0, dsl.NodeTypeStringLiteral) >>
| "y" << dsl.NewASTNodeZary($0, dsl.NodeTypeStringLiteral) >>
| "z" << dsl.NewASTNodeZary($0, dsl.NodeTypeStringLiteral) >>
;