update
This commit is contained in:
parent
98c58c4680
commit
d24e7088e3
|
@ -25,6 +25,7 @@ int main()
|
||||||
std::cout<<">> [lexer ] turn code into tokens."<<std::endl;
|
std::cout<<">> [lexer ] turn code into tokens."<<std::endl;
|
||||||
std::cout<<">> [parser] turn tokens into abstract syntax tree."<<std::endl;
|
std::cout<<">> [parser] turn tokens into abstract syntax tree."<<std::endl;
|
||||||
std::cout<<">> [ast ] check the abstract syntax tree."<<std::endl;
|
std::cout<<">> [ast ] check the abstract syntax tree."<<std::endl;
|
||||||
|
std::cout<<">> [run ] run code."<<std::endl;
|
||||||
std::cout<<">> [exit ] quit nasal interpreter."<<std::endl;
|
std::cout<<">> [exit ] quit nasal interpreter."<<std::endl;
|
||||||
}
|
}
|
||||||
else if(command=="cls")
|
else if(command=="cls")
|
||||||
|
|
|
@ -25,6 +25,8 @@ class nasal_parse
|
||||||
abstract_syntax_tree string_expr();
|
abstract_syntax_tree string_expr();
|
||||||
abstract_syntax_tree nil_expr();
|
abstract_syntax_tree nil_expr();
|
||||||
abstract_syntax_tree var_outside_definition();
|
abstract_syntax_tree var_outside_definition();
|
||||||
|
abstract_syntax_tree loop_expr();
|
||||||
|
abstract_syntax_tree choose_expr();
|
||||||
};
|
};
|
||||||
|
|
||||||
void nasal_parse::print_detail_token()
|
void nasal_parse::print_detail_token()
|
||||||
|
@ -99,7 +101,7 @@ void nasal_parse::push_token()
|
||||||
if(!checked_tokens.empty())
|
if(!checked_tokens.empty())
|
||||||
{
|
{
|
||||||
parse_token_stream.push(checked_tokens.top());
|
parse_token_stream.push(checked_tokens.top());
|
||||||
this_token=checked_token.top();
|
this_token=checked_tokens.top();
|
||||||
checked_tokens.pop();
|
checked_tokens.pop();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -145,7 +147,7 @@ void nasal_parse::main_generate()
|
||||||
case __while:
|
case __while:
|
||||||
case __for:
|
case __for:
|
||||||
case __foreach:
|
case __foreach:
|
||||||
case __forindex:break;
|
case __forindex:this->push_token();root.get_children().push_back(loop_expr());break;
|
||||||
case __semi:break;
|
case __semi:break;
|
||||||
default:++error;print_parse_error(error_token_in_main,this_token.line,this_token.type);
|
default:++error;print_parse_error(error_token_in_main,this_token.line,this_token.type);
|
||||||
}
|
}
|
||||||
|
@ -186,6 +188,7 @@ abstract_syntax_tree nasal_parse::nil_expr()
|
||||||
abstract_syntax_tree nasal_parse::var_outside_definition()
|
abstract_syntax_tree nasal_parse::var_outside_definition()
|
||||||
{
|
{
|
||||||
abstract_syntax_tree definition_node;
|
abstract_syntax_tree definition_node;
|
||||||
|
definition_node.set_type(__definition);
|
||||||
this->get_token();
|
this->get_token();
|
||||||
if(this_token.type!=__var)
|
if(this_token.type!=__var)
|
||||||
{
|
{
|
||||||
|
@ -204,7 +207,28 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
|
||||||
++error;
|
++error;
|
||||||
print_parse_error(definition_lack_id,this_token.line);
|
print_parse_error(definition_lack_id,this_token.line);
|
||||||
}
|
}
|
||||||
|
|
||||||
return definition_node;
|
return definition_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract_syntax_tree nasal_parse::loop_expr()
|
||||||
|
{
|
||||||
|
abstract_syntax_tree loop_main_node;
|
||||||
|
loop_main_node.set_type(__loop);
|
||||||
|
this->get_token();
|
||||||
|
switch(this_token.type)
|
||||||
|
{
|
||||||
|
case __for:
|
||||||
|
case __while:
|
||||||
|
case __foreach:
|
||||||
|
case __forindex:break;
|
||||||
|
}
|
||||||
|
return loop_main_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract_syntax_tree nasal_parse::choose_expr()
|
||||||
|
{
|
||||||
|
abstract_syntax_tree choose_main_node;
|
||||||
|
choose_main_node.set_type(__ifelse);
|
||||||
|
return choose_main_node;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,28 +6,61 @@
|
||||||
|
|
||||||
<number> ::= <token_number>
|
<number> ::= <token_number>
|
||||||
<string> ::= <token_string>
|
<string> ::= <token_string>
|
||||||
|
<nil> ::= <token_reserve_word_nil>
|
||||||
<id> ::= <token_identifier>
|
<id> ::= <token_identifier>
|
||||||
<dynamic_id> ::= <token_dynamic_id>
|
<dynamic_id> ::= <token_dynamic_id>
|
||||||
|
|
||||||
|
<vector> ::= <[> {<scalar> <,>} <]>
|
||||||
|
<hash> ::= <{> {(<id> | <string>) <:> <scalar> <,>} <}>
|
||||||
<scalar> ::=
|
<scalar> ::=
|
||||||
|
<number>
|
||||||
|
| <nil>
|
||||||
|
| <string>
|
||||||
|
| <call_identifier>
|
||||||
|
| <calculation>
|
||||||
|
| <function>
|
||||||
|
| <(> <scalar> <)>
|
||||||
|
| <hash>
|
||||||
|
| <vector>
|
||||||
|
|
||||||
<calculation_expr> ::=
|
<function> ::=
|
||||||
<or_expr> {<and> <or_expr>}
|
<func> [<(> <)>] <statement>
|
||||||
<or_expr> ::=
|
| <func> [<(> <)>] <{> {<statement> <;>} <}>
|
||||||
<unary_expr> {<or> <unary_expr>}
|
| <func> <(> {<id> <,>} {<id> <=> <scalar> <,>} {<dynamic_id>} <)> <statement>
|
||||||
| <unary_expr> {<or> <additive_expr>}
|
| <func> <(> {<id> <,>} {<id> <=> <scalar> <,>} {<dynamic_id>} <)> <{> {<statement> <;>} <}>
|
||||||
| <additive_expr> {<or> <unary_expr>}
|
|
||||||
| <additive_expr> {<or> <additive_expr>}
|
|
||||||
<unary_expr> ::=
|
|
||||||
<-> <additive_expr>
|
|
||||||
| <!> <additive_expr>
|
|
||||||
<additive_expr> ::=
|
|
||||||
<multive_expr> {<+> <multive_expr>}
|
|
||||||
| <multive_expr> {<-> <multive_expr>}
|
|
||||||
| <multive_expr> {<~> <multive_expr>}
|
|
||||||
<multive_expr> ::=
|
|
||||||
<scalar> {<*> <scalar>}
|
|
||||||
| <scalar> {</> <scalar>}
|
|
||||||
|
|
||||||
|
<call_identifier> ::=
|
||||||
|
<scalar> { (<[> {<scalar> <,>} <]>) | (<[> <scalar> <:> [<scalar>] <]>) | (<.> <id>) | (<(> {<scalar> <,>} <)>) | (<(> {<id> <:> <scalar> <,>} <)>) }
|
||||||
|
| <id> { (<[> {<scalar> <,>} <]>) | (<[> <scalar> <:> [<scalar>] <]>) | (<.> <id>) | (<(> {<scalar> <,>} <)>) | (<(> {<id> <:> <scalar> <,>} <)>) }
|
||||||
|
| <func> <id>
|
||||||
|
| <func> <id> <(> <)> { (<[> {<scalar> <,>} <]>) | (<[> <scalar> <:> [<scalar>] <]>) | (<.> <id>) | (<(> {<scalar> <,>} <)>) | (<(> {<id> <:> <scalar> <,>} <)>) }
|
||||||
|
|
||||||
|
<calculation> ::=
|
||||||
|
<and_calc>
|
||||||
|
| <or_calc>
|
||||||
|
| <additive_calc>
|
||||||
|
| <multive_calc>
|
||||||
|
| <scalar>
|
||||||
|
<and_calc> ::=
|
||||||
|
<or_calc> {<and> <or_calc>}
|
||||||
|
<or_calc> ::=
|
||||||
|
<additive_calc> {<or> <additive_calc>}
|
||||||
|
<additive_calc> ::=
|
||||||
|
<multive_calc> {<+>|<->|<~> <multive_calc>}
|
||||||
|
<multive_calc> ::=
|
||||||
|
<scalar> {<*>|</> <scalar>}
|
||||||
|
|
||||||
|
<definition> ::=
|
||||||
|
<var> <id>
|
||||||
|
| <var> <id> <=> <scalar>
|
||||||
|
| <var> <(> {(<id>) | (<call_identifier>) <,>} <)> <=> <scalar>
|
||||||
|
| <(> <var> {(<id>) | (<call_identifier>) <,>} <)> <=> <scalar>
|
||||||
|
| <var> <(> {(<id>) | (<call_identifier>) <,>} <)> <=> <(> {<scalar> <,>} <)>
|
||||||
|
| <(> <var> {(<id>) | (<call_identifier>) <,>} <)> <=> <(> {<scalar> <,>} <)>
|
||||||
|
<assignment> ::=
|
||||||
|
<call_identifier> <=> <scalar>
|
||||||
|
| <(> {<call_identifier> <,>} <)> <=> <scalar>
|
||||||
|
| <(> {<call_identifier> <,>} <)> <=> <(> {<scalar> <,>} <)>
|
||||||
<loop_expr> ::=
|
<loop_expr> ::=
|
||||||
<for_loop>
|
<for_loop>
|
||||||
| <while_loop>
|
| <while_loop>
|
||||||
|
@ -38,13 +71,13 @@
|
||||||
| <for> <(> [<statement>] <;> [<scalar>] <;> <statement> <)> <{> {<statement> <;>} <}>
|
| <for> <(> [<statement>] <;> [<scalar>] <;> <statement> <)> <{> {<statement> <;>} <}>
|
||||||
<while_loop> ::=
|
<while_loop> ::=
|
||||||
<while> <(> <scalar> <)> <statement> [<;>]
|
<while> <(> <scalar> <)> <statement> [<;>]
|
||||||
| <while> <(> <scalar> <) <{> {<statement> <;>} <}>
|
| <while> <(> <scalar> <)> <{> {<statement> <;>} <}>
|
||||||
<forindex_loop> ::=
|
<forindex_loop> ::=
|
||||||
<forindex> <(> [<statement] <;> [<scalar>] <)> <statement> [<;>]
|
<forindex> <(> [<statement] <;> [<scalar>] <)> <statement> [<;>]
|
||||||
| <forindex> <(> [<statement] <;> [<scalar>] <) <{> {<statement> <;>} <}>
|
| <forindex> <(> [<statement] <;> [<scalar>] <)> <{> {<statement> <;>} <}>
|
||||||
<foreach_loop> ::=
|
<foreach_loop> ::=
|
||||||
<foreach> <(> [<statement] <;> [<scalar>] <)> <statement> [<;>]
|
<foreach> <(> [<statement] <;> [<scalar>] <)> <statement> [<;>]
|
||||||
| <foreach> <(> [<statement] <;> [<scalar>] <) <{> {<statement> <;>} <}>
|
| <foreach> <(> [<statement] <;> [<scalar>] <)> <{> {<statement> <;>} <}>
|
||||||
|
|
||||||
<choose_expr> ::= <choose_expr_if> {<choose_expr_elsif>} [<choose_expr_else>]
|
<choose_expr> ::= <choose_expr_if> {<choose_expr_elsif>} [<choose_expr_else>]
|
||||||
<choose_expr_if> ::=
|
<choose_expr_if> ::=
|
||||||
|
@ -57,7 +90,7 @@
|
||||||
| <else> <if> <(> <scalar> <)> <{> {<statement> <;>} <}>
|
| <else> <if> <(> <scalar> <)> <{> {<statement> <;>} <}>
|
||||||
<choose_expr_else> ::=
|
<choose_expr_else> ::=
|
||||||
<else> <statement> [<;>]
|
<else> <statement> [<;>]
|
||||||
| <else> {<statement> <;>} <}>
|
| <else> <{> {<statement> <;>} <}>
|
||||||
|
|
||||||
<continue_expr> ::= <continue>
|
<continue_expr> ::= <continue>
|
||||||
<break_expr> ::= <break>
|
<break_expr> ::= <break>
|
||||||
|
|
Loading…
Reference in New Issue