Skip to content

Commit

Permalink
initial attempt
Browse files Browse the repository at this point in the history
  • Loading branch information
arai-a committed Dec 18, 2019
1 parent dc1dd1e commit 2971f4f
Show file tree
Hide file tree
Showing 10 changed files with 8,681 additions and 5,675 deletions.
167 changes: 129 additions & 38 deletions js_parser/es-simplified.esgrammar
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ BindingIdentifier[Yield, Await] :
Identifier
=> binding_identifier($0)
`yield`
=> binding_identifier_yield()
=> binding_identifier_yield($0)
`await`
=> binding_identifier_await()
=> binding_identifier_await($0)

@returns Label
LabelIdentifier[Yield, Await] :
Expand Down Expand Up @@ -636,9 +636,19 @@ BlockStatement[Yield, Await, Return] :

@returns Block
Block[Yield, Await, Return] :
`{` StatementList[?Yield, ?Await, ?Return]? `}`
StartOfBlock StatementList[?Yield, ?Await, ?Return]? EndOfBlock
=> block($1)

@returns Unit
StartOfBlock :
`{`
=> start_of_block()

@returns Unit
EndOfBlock :
`}`
=> end_of_block()

@returns Vec<Statement>
StatementList[Yield, Await, Return] :
StatementListItem[?Yield, ?Await, ?Return]
Expand All @@ -661,7 +671,7 @@ LexicalDeclaration[In, Yield, Await] :

@returns VariableDeclarationOrExpression
ForLexicalDeclaration[In, Yield, Await] :
LetOrConst BindingList[?In, ?Yield, ?Await] `;`
ForLetOrConst BindingList[?In, ?Yield, ?Await] `;`
=> for_lexical_declaration($0, $1)

@returns VariableDeclarationKind
Expand All @@ -671,6 +681,13 @@ LetOrConst :
`const`
=> const_kind()

@returns VariableDeclarationKind
ForLetOrConst :
`let`
=> for_let_kind()
`const`
=> for_const_kind()

@returns Vec<VariableDeclarator>
BindingList[In, Yield, Await] :
LexicalBinding[?In, ?Yield, ?Await]
Expand All @@ -688,9 +705,19 @@ LexicalBinding[In, Yield, Await] :

@returns Statement
VariableStatement[Yield, Await] :
`var` VariableDeclarationList[+In, ?Yield, ?Await] `;`
StartOfVariableDeclarationList VariableDeclarationList[+In, ?Yield, ?Await] EndOfVariableDeclarationList
=> variable_statement($1)

@returns Unit
StartOfVariableDeclarationList :
`var`
=> start_of_variable_declaration_list()

@returns Unit
EndOfVariableDeclarationList :
`;`
=> end_of_variable_declaration_list()

@returns Vec<VariableDeclarator>
VariableDeclarationList[In, Yield, Await] :
VariableDeclaration[?In, ?Yield, ?Await]
Expand Down Expand Up @@ -811,32 +838,42 @@ IterationStatement[Yield, Await, Return] :
=> while_statement($2, $4)
`for` `(` [lookahead != `let`] Expression[~In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
=> for_statement(for_expression($2), $4, $6, $8)
`for` `(` `var` VariableDeclarationList[~In, ?Yield, ?Await] `;` Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
`for` `(` StartOfVariableDeclarationList VariableDeclarationList[~In, ?Yield, ?Await] EndOfVariableDeclarationList Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
=> for_statement(Some(for_var_declaration($3)), $5, $7, $9)
`for` `(` ForLexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]? `;` Expression[+In, ?Yield, ?Await]? `)` Statement[?Yield, ?Await, ?Return]
=> for_statement(Some(unbox_for_lexical_declaration($2)), $3, $5, $7)
=> for_statement_lexical(Some(unbox_for_lexical_declaration($2)), $3, $5, $7)
`for` `(` [lookahead != `let`] LeftHandSideExpression[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
=> for_in_statement(for_assignment_target($2), $4, $6)
`for` `(` `var` ForBinding[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
`for` `(` StartOfVariableDeclarationList ForBinding[?Yield, ?Await] EndOfForBindingWithIn Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
=> for_in_statement(for_in_or_of_var_declaration($3), $5, $7)
`for` `(` ForDeclaration[?Yield, ?Await] `in` Expression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
=> for_in_statement(unbox_for_declaration($2), $4, $6)
=> for_in_statement_lexical(unbox_for_declaration($2), $4, $6)
`for` `(` [lookahead <! {`async`, `let`} ] LeftHandSideExpression[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
=> for_of_statement(for_assignment_target($2), $4, $6)
`for` `(` `var` ForBinding[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
`for` `(` StartOfVariableDeclarationList ForBinding[?Yield, ?Await] EndOfForBindingWithOf AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
=> for_of_statement(for_in_or_of_var_declaration($3), $5, $7)
`for` `(` ForDeclaration[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
=> for_of_statement(unbox_for_declaration($2), $4, $6)
=> for_of_statement_lexical(unbox_for_declaration($2), $4, $6)
[+Await] `for` `await` `(` [lookahead <! {`async`, `let`} ] LeftHandSideExpression[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
=> for_await_of_statement(for_assignment_target($3), $5, $7)
[+Await] `for` `await` `(` `var` ForBinding[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
[+Await] `for` `await` `(` StartOfVariableDeclarationList ForBinding[?Yield, ?Await] EndOfForBindingWithOf AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
=> for_await_of_statement(for_in_or_of_var_declaration($4), $6, $8)
[+Await] `for` `await` `(` ForDeclaration[?Yield, ?Await] `of` AssignmentExpression[+In, ?Yield, ?Await] `)` Statement[?Yield, ?Await, ?Return]
=> for_await_of_statement(unbox_for_declaration($3), $5, $7)
=> for_await_of_statement_lexical(unbox_for_declaration($3), $5, $7)

@returns Unit
EndOfForBindingWithIn :
`in`
=> end_of_variable_declaration_list()

@returns Unit
EndOfForBindingWithOf :
`of`
=> end_of_variable_declaration_list()

@returns VariableDeclarationOrAssignmentTarget
ForDeclaration[Yield, Await] :
LetOrConst ForBinding[?Yield, ?Await]
ForLetOrConst ForBinding[?Yield, ?Await]
=> for_declaration($0, $1)

@returns Binding
Expand Down Expand Up @@ -884,11 +921,21 @@ SwitchStatement[Yield, Await, Return] :

@returns Statement
CaseBlock[Yield, Await, Return] :
`{` CaseClauses[?Yield, ?Await, ?Return]? `}`
StartOfCaseBlock CaseClauses[?Yield, ?Await, ?Return]? EndOfCaseBlock
=> case_block($1)
`{` CaseClauses[?Yield, ?Await, ?Return]? DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]? `}`
StartOfCaseBlock CaseClauses[?Yield, ?Await, ?Return]? DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]? EndOfCaseBlock
=> case_block_with_default($1, $2, $3)

@returns Unit
StartOfCaseBlock :
`{`
=> start_of_case_block()

@returns Unit
EndOfCaseBlock :
`}`
=> end_of_case_block()

@returns Vec<SwitchCase>
CaseClauses[Yield, Await, Return] :
CaseClause[?Yield, ?Await, ?Return]
Expand Down Expand Up @@ -936,11 +983,21 @@ TryStatement[Yield, Await, Return] :

@returns CatchClause
Catch[Yield, Await, Return] :
`catch` `(` CatchParameter[?Yield, ?Await] `)` Block[?Yield, ?Await, ?Return]
`catch` StartOfCatchParameter CatchParameter[?Yield, ?Await] EndOfCatchParameter Block[?Yield, ?Await, ?Return]
=> catch(Some($2), $4)
`catch` Block[?Yield, ?Await, ?Return]
=> catch(None, $1)

@returns Unit
StartOfCatchParameter :
`(`
=> start_of_catch_parameter()

@returns Unit
EndOfCatchParameter :
`)`
=> end_of_catch_parameter()

@returns Block
Finally[Yield, Await, Return] :
`finally` Block[?Yield, ?Await, ?Return]
Expand All @@ -962,16 +1019,36 @@ DebuggerStatement :

@returns Statement
FunctionDeclaration[Yield, Await, Default] :
`function` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
StartOfFunctionDeclaration BindingIdentifier[?Yield, ?Await] StartOfFormalParameters FormalParameters[~Yield, ~Await] EndOfFormalParameters `{` FunctionBody[~Yield, ~Await] `}`
=> function_decl(function(Some($1), $3, $6))
[+Default] `function` `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
[+Default] StartOfFunctionDeclaration StartOfFormalParameters FormalParameters[~Yield, ~Await] EndOfFormalParameters `{` FunctionBody[~Yield, ~Await] `}`
=> function_decl(function(None, $2, $5))

@returns Unit
StartOfFunctionDeclaration:
`function`
=> start_of_function_decl()

@returns Unit
StartOfFormalParameters:
`(`
=> start_of_formal_parameters()

@returns Unit
EndOfFormalParameters:
`)`
=> end_of_formal_parameters()

@returns Expression
FunctionExpression :
`function` BindingIdentifier[~Yield, ~Await]? `(` FormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
StartOfFunctionExpression BindingIdentifier[~Yield, ~Await]? StartOfFormalParameters FormalParameters[~Yield, ~Await] EndOfFormalParameters `{` FunctionBody[~Yield, ~Await] `}`
=> function_expr(function($1, $3, $6))

@returns Unit
StartOfFunctionExpression:
`function`
=> start_of_function_expr()

@returns FormalParameters
UniqueFormalParameters[Yield, Await] :
FormalParameters[?Yield, ?Await]
Expand Down Expand Up @@ -1039,12 +1116,21 @@ ConciseBody[In] :


ArrowFormalParameters[Yield, Await] :
`(` UniqueFormalParameters[?Yield, ?Await] `)`
StartOfUniqueFormalParameters UniqueFormalParameters[?Yield, ?Await] EndOfUniqueFormalParameters

@returns Unit
StartOfUniqueFormalParameters:
`(`
=> start_of_unique_formal_parameters()

@returns Unit
EndOfUniqueFormalParameters:
`)`
=> end_of_unique_formal_parameters()

@returns MethodDefinition
MethodDefinition[Yield, Await] :
PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[~Yield, ~Await] `)` `{` FunctionBody[~Yield, ~Await] `}`
PropertyName[?Yield, ?Await] StartOfUniqueFormalParameters UniqueFormalParameters[~Yield, ~Await] EndOfUniqueFormalParameters `{` FunctionBody[~Yield, ~Await] `}`
=> method_definition($0, $2, $5)
GeneratorMethod[?Yield, ?Await]
=> $0
Expand All @@ -1065,19 +1151,19 @@ PropertySetParameterList :

@returns MethodDefinition
GeneratorMethod[Yield, Await] :
`*` PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
`*` PropertyName[?Yield, ?Await] StartOfUniqueFormalParameters UniqueFormalParameters[+Yield, ~Await] EndOfUniqueFormalParameters `{` GeneratorBody `}`
=> generator_method($1, $3, $6)

@returns Statement
GeneratorDeclaration[Yield, Await, Default] :
`function` `*` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
`function` `*` BindingIdentifier[?Yield, ?Await] StartOfFormalParameters FormalParameters[+Yield, ~Await] EndOfFormalParameters `{` GeneratorBody `}`
=> function_decl(generator(Some($2), $4, $7))
[+Default] `function` `*` `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
[+Default] `function` `*` StartOfFormalParameters FormalParameters[+Yield, ~Await] EndOfFormalParameters `{` GeneratorBody `}`
=> function_decl(generator(None, $3, $6))

@returns Expression
GeneratorExpression :
`function` `*` BindingIdentifier[+Yield, ~Await]? `(` FormalParameters[+Yield, ~Await] `)` `{` GeneratorBody `}`
`function` `*` BindingIdentifier[+Yield, ~Await]? StartOfFormalParameters FormalParameters[+Yield, ~Await] EndOfFormalParameters `{` GeneratorBody `}`
=> function_expr(generator($2, $4, $7))

@returns FunctionBody
Expand All @@ -1097,19 +1183,19 @@ YieldExpression[In, Await] :

@returns MethodDefinition
AsyncGeneratorMethod[Yield, Await] :
`async` `*` PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
`async` `*` PropertyName[?Yield, ?Await] StartOfUniqueFormalParameters UniqueFormalParameters[+Yield, +Await] EndOfUniqueFormalParameters `{` AsyncGeneratorBody `}`
=> async_generator_method($2, $4, $7)

@returns Statement
AsyncGeneratorDeclaration[Yield, Await, Default] :
`async` `function` `*` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
`async` `function` `*` BindingIdentifier[?Yield, ?Await] StartOfFormalParameters FormalParameters[+Yield, +Await] EndOfFormalParameters `{` AsyncGeneratorBody `}`
=> function_decl(async_generator(Some($3), $5, $8))
[+Default] `async` `function` `*` `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
[+Default] `async` `function` `*` StartOfFormalParameters FormalParameters[+Yield, +Await] EndOfFormalParameters `{` AsyncGeneratorBody `}`
=> function_decl(async_generator(None, $4, $7))

@returns Expression
AsyncGeneratorExpression :
`async` `function` `*` BindingIdentifier[+Yield, +Await]? `(` FormalParameters[+Yield, +Await] `)` `{` AsyncGeneratorBody `}`
`async` `function` `*` BindingIdentifier[+Yield, +Await]? StartOfFormalParameters FormalParameters[+Yield, +Await] EndOfFormalParameters `{` AsyncGeneratorBody `}`
=> function_expr(async_function($3, $5, $8))

@returns FunctionBody
Expand All @@ -1120,14 +1206,19 @@ AsyncGeneratorBody :

@returns Statement
ClassDeclaration[Yield, Await, Default] :
`class` BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
StartOfClass BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
=> class_declaration(Some($1), $2)
[+Default] `class` ClassTail[?Yield, ?Await]
[+Default] StartOfClass ClassTail[?Yield, ?Await]
=> class_declaration(None, $1)

@returns Unit
StartOfClass :
`class`
=> start_of_class()

@returns Expression
ClassExpression[Yield, Await] :
`class` BindingIdentifier[?Yield, ?Await]? ClassTail[?Yield, ?Await]
StartOfClass BindingIdentifier[?Yield, ?Await]? ClassTail[?Yield, ?Await]
=> class_expression($1, $2)

@returns ClassExpression
Expand Down Expand Up @@ -1164,21 +1255,21 @@ ClassElement[Yield, Await] :

@returns Statement
AsyncFunctionDeclaration[Yield, Await, Default] :
`async` `function` BindingIdentifier[?Yield, ?Await] `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
`async` `function` BindingIdentifier[?Yield, ?Await] StartOfFormalParameters FormalParameters[~Yield, +Await] EndOfFormalParameters `{` AsyncFunctionBody `}`
=> function_decl(async_function(Some($2), $4, $7))
[+Default] `async` `function` `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
[+Default] `async` `function` StartOfFormalParameters FormalParameters[~Yield, +Await] EndOfFormalParameters `{` AsyncFunctionBody `}`
=> function_decl(async_function(None, $3, $6))

@returns Expression
AsyncFunctionExpression :
`async` `function` `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
`async` `function` StartOfFormalParameters FormalParameters[~Yield, +Await] EndOfFormalParameters `{` AsyncFunctionBody `}`
=> function_expr(async_function(None, $3, $6))
`async` `function` BindingIdentifier[~Yield, +Await] `(` FormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
`async` `function` BindingIdentifier[~Yield, +Await] StartOfFormalParameters FormalParameters[~Yield, +Await] EndOfFormalParameters `{` AsyncFunctionBody `}`
=> function_expr(async_function(Some($2), $4, $7))

@returns MethodDefinition
AsyncMethod[Yield, Await] :
`async` PropertyName[?Yield, ?Await] `(` UniqueFormalParameters[~Yield, +Await] `)` `{` AsyncFunctionBody `}`
`async` PropertyName[?Yield, ?Await] StartOfUniqueFormalParameters UniqueFormalParameters[~Yield, +Await] EndOfUniqueFormalParameters `{` AsyncFunctionBody `}`
=> async_method($1, $3, $6)

@returns FunctionBody
Expand Down
5 changes: 4 additions & 1 deletion jsparagus/emit/rust.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@
'array_expression_to_array_assignment_target',
'assignment_expression',
'async_arrow_parameters',
'binding_identifier',
'binding_identifier_yield',
'binding_identifier_await',
'compound_assignment_expression',
'cover_initialized_name',
'cover_initialized_name',
Expand Down Expand Up @@ -375,7 +378,7 @@ def reduce(self):
# Note use of std::vec::Vec below: we have imported `arena::Vec` in this module,
# since every other data structure mentioned in this file lives in the arena.
self.write(0, "pub fn reduce<'alloc>(")
self.write(1, "handler: &AstBuilder<'alloc>,")
self.write(1, "handler: &mut AstBuilder<'alloc>,")
self.write(1, "prod: usize,")
self.write(1, "stack: &mut std::vec::Vec<StackValue<'alloc>>,")
self.write(0, ") -> Result<'alloc, NonterminalId> {")
Expand Down
7 changes: 7 additions & 0 deletions rust/ast/generate_ast.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ def write(*args):
write(0, "pub enum StackValue<'alloc> {")
for ty in types:
write(1, "{}({}),", ty.rust_variant_name(), Type('Box', [ty]).to_rust_type(ast))
write(1, "Unit,")
write(0, "}")
write(0, "")
write(0, "impl<'alloc> StackValue<'alloc> {")
Expand Down Expand Up @@ -236,6 +237,12 @@ def write(*args):
write(2, "Ok(self?.try_into_stack()?)")
write(1, "}")
write(0, "}")
write(0, "impl<'alloc> TryIntoStack<'alloc> for arena::Box<'alloc, ()> {")
write(1, "type Error = Infallible;")
write(1, "fn try_into_stack(self) -> Result<StackValue<'alloc>, Infallible> {")
write(2, "Ok(StackValue::Unit)")
write(1, "}")
write(0, "}")


def pass_(ast):
Expand Down
Loading

0 comments on commit 2971f4f

Please sign in to comment.