mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-19 01:15:21 +00:00
118 lines
2.8 KiB
BNF
118 lines
2.8 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 "two/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 Emittable
|
|
<<
|
|
dsl.NewASTNodeUnary($0, $1, dsl.NodeTypeEmitStatement)
|
|
/*
|
|
dsl.NewASTNodeUnary(
|
|
$0,
|
|
dsl.NewASTNodeNestable(
|
|
$1,
|
|
),
|
|
dsl.NodeTypeEmitStatement,
|
|
)
|
|
*/
|
|
>>
|
|
|
|
| emit "(" EmittableList ")"
|
|
<< dsl.NewASTNodeUnary($0, $2, dsl.NodeTypeEmitStatement) >>
|
|
|
|
| emit Emittable "," EmitKeys
|
|
<< dsl.NewASTNodeBinary($0, $1, $3, dsl.NodeTypeEmitStatement) >>
|
|
|
|
| emit "(" EmittableList ")" "," EmitKeys
|
|
<< dsl.NewASTNodeBinary($0, $2, $5, dsl.NodeTypeEmitStatement) >>
|
|
;
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
EmittableList
|
|
: Emittable
|
|
<< dsl.NewASTNodeUnary(
|
|
nil,
|
|
$0,
|
|
dsl.NodeTypeEmittableList,
|
|
) >>
|
|
|
|
// Allow trailing final comma, especially for multiline statements
|
|
| Emittable "," EmittableList
|
|
<< dsl.PrependChild(
|
|
$2,
|
|
$0,
|
|
) >>
|
|
;
|
|
|
|
Emittable
|
|
: Literal
|
|
;
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
EmitKeys
|
|
|
|
: Rvalue
|
|
<< dsl.NewASTNodeUnary(
|
|
nil,
|
|
$0,
|
|
dsl.NodeTypeEmitKeys,
|
|
) >>
|
|
|
|
| Rvalue "," EmitKeys
|
|
<< dsl.PrependChild(
|
|
$2,
|
|
$0,
|
|
) >>
|
|
;
|
|
|
|
|
|
// ----------------------------------------------------------------
|
|
Rvalue
|
|
: Literal
|
|
<< dsl.NewASTNodeUnary(nil, $0, dsl.NodeTypeStringLiteral) >>
|
|
| "(" Literal ")"
|
|
<< dsl.NewASTNodeUnary(nil, $1, dsl.NodeTypeStringLiteral) >>
|
|
| "[" Literal "]"
|
|
<< dsl.NewASTNodeUnary(nil, $1, dsl.NodeTypeStringLiteral) >>
|
|
| "[" Literal "," Literal "]"
|
|
<< dsl.NewASTNodeBinary(nil, $1, $2, dsl.NodeTypeStringLiteral) >>
|
|
;
|
|
|
|
Literal
|
|
: "x" << dsl.NewASTNodeZary($0, dsl.NodeTypeStringLiteral) >>
|
|
| "y" << dsl.NewASTNodeZary($0, dsl.NodeTypeStringLiteral) >>
|
|
| "z" << dsl.NewASTNodeZary($0, dsl.NodeTypeStringLiteral) >>
|
|
;
|