📄 compiler.js
字号:
/* One clause parsed. */
clauses.push (stmts);
}
else
JSC$parser_syntax_error ();
}
return new JSC$stmt_switch (linenum, JSC$parser_token_linenum, expr,
clauses);
}
function JSC$parser_parse_try (stream)
{
var linenum = JSC$parser_token_linenum;
var block = JSC$parser_parse_stmt (stream);
if (!block)
JSC$parser_syntax_error ();
var try_block_last_linenum = JSC$parser_token_linenum;
/* Now we must see `catch' or `finally'. */
var token = JSC$parser_peek_token (stream);
if (token != JSC$tCATCH && token != JSC$tFINALLY)
JSC$parser_syntax_error ();
var catch_list = false;
if (token == JSC$tCATCH)
{
/* Parse catch list. */
catch_list = new Array ();
catch_list.linenum = JSC$parser_peek_token_linenum;
while (token == JSC$tCATCH)
{
JSC$parser_get_token (stream);
var c = new Object ();
c.linenum = JSC$parser_token_linenum;
if (JSC$parser_get_token (stream) != #'(')
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != JSC$tIDENTIFIER)
JSC$parser_syntax_error ();
c.id = JSC$parser_token_value;
c.guard = false;
if (JSC$parser_peek_token (stream) == JSC$tIF)
{
JSC$parser_get_token (stream);
c.guard = JSC$parser_parse_expr (stream);
if (!c.guard)
JSC$parser_syntax_error ();
}
if (JSC$parser_get_token (stream) != #')')
JSC$parser_syntax_error ();
c.stmt = JSC$parser_parse_stmt (stream);
if (!c.stmt)
JSC$parser_syntax_error ();
catch_list.push (c);
token = JSC$parser_peek_token (stream);
}
catch_list.last_linenum = JSC$parser_token_linenum;
}
var fin = false;
if (token == JSC$tFINALLY)
{
/* Parse the finally. */
JSC$parser_get_token (stream);
fin = JSC$parser_parse_stmt (stream);
if (!fin)
JSC$parser_syntax_error ();
}
return new JSC$stmt_try (linenum, try_block_last_linenum,
JSC$parser_token_linenum, block, catch_list,
fin);
}
function JSC$parser_parse_variable_stmt (stream)
{
var list, id, expr, token;
if (JSC$parser_peek_token (stream) != JSC$tVAR)
return false;
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
list = new Array ();
while (true)
{
token = JSC$parser_peek_token (stream);
if (token == JSC$tIDENTIFIER)
{
JSC$parser_get_token ();
id = JSC$parser_token_value;
if (JSC$parser_peek_token (stream) == #'=')
{
JSC$parser_get_token (stream);
expr = JSC$parser_parse_assignment_expr (stream);
if (typeof expr == "boolean")
JSC$parser_syntax_error ();
}
else
expr = null;
list.push (new JSC$var_declaration (id, expr));
/* Check if we have more input. */
if (JSC$parser_peek_token (stream) == #',')
{
/* Yes we have. */
JSC$parser_get_token (stream);
/* The next token must be tIDENTIFIER. */
if (JSC$parser_peek_token (stream) != JSC$tIDENTIFIER)
JSC$parser_syntax_error ();
}
else
{
/* No, we don't. */
JSC$parser_get_semicolon_asci (stream);
break;
}
}
else
{
/* We'r done. */
JSC$parser_get_semicolon_asci (stream);
break;
}
}
/* There must be at least one variable declaration. */
if (list.length == 0)
JSC$parser_syntax_error ();
return new JSC$stmt_variable (ln, list);
}
function JSC$parser_parse_if_stmt (stream)
{
var expr, stmt, stmt2;
if (JSC$parser_peek_token (stream) != JSC$tIF)
return false;
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
if (JSC$parser_get_token (stream) != #'(')
JSC$parser_syntax_error ();
expr = JSC$parser_parse_expr (stream);
if (typeof expr == "boolean")
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != #')')
JSC$parser_syntax_error ();
stmt = JSC$parser_parse_stmt (stream);
if (typeof stmt == "boolean")
JSC$parser_syntax_error ();
if (JSC$parser_peek_token (stream) == JSC$tELSE)
{
JSC$parser_get_token (stream);
stmt2 = JSC$parser_parse_stmt (stream);
if (typeof stmt2 == "boolean")
JSC$parser_syntax_error ();
}
else
stmt2 = null;
return new JSC$stmt_if (ln, expr, stmt, stmt2);
}
function JSC$parser_parse_iteration_stmt (stream)
{
var token, expr1, expr2, expr3, stmt;
token = JSC$parser_peek_token (stream);
if (token == JSC$tDO)
{
/* do Statement while (Expression); */
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
stmt = JSC$parser_parse_stmt (stream);
if (typeof stmt == "boolean")
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != JSC$tWHILE)
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != #'(')
JSC$parser_syntax_error ();
expr1 = JSC$parser_parse_expr (stream);
if (typeof expr1 == "boolean")
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != #')')
JSC$parser_syntax_error ();
JSC$parser_get_semicolon_asci (stream);
return new JSC$stmt_do_while (ln, expr1, stmt);
}
else if (token == JSC$tWHILE)
{
/* while (Expression) Statement */
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
if (JSC$parser_get_token (stream) != #'(')
JSC$parser_syntax_error ();
expr1 = JSC$parser_parse_expr (stream);
if (typeof expr1 == "boolean")
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != #')')
JSC$parser_syntax_error ();
stmt = JSC$parser_parse_stmt (stream);
if (typeof stmt == "boolean")
JSC$parser_syntax_error ();
return new JSC$stmt_while (ln, expr1, stmt);
}
else if (token == JSC$tFOR)
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
if (JSC$parser_get_token (stream) != #'(')
JSC$parser_syntax_error ();
/* Init */
var vars = null;
token = JSC$parser_peek_token (stream);
if (token == JSC$tVAR)
{
JSC$parser_get_token (stream);
vars = new Array ();
while (true)
{
/* The identifier. */
token = JSC$parser_peek_token (stream);
if (token != JSC$tIDENTIFIER)
break;
JSC$parser_get_token (stream);
var id = JSC$parser_token_value;
/* Possible initializer. */
var expr = null;
if (JSC$parser_peek_token (stream) == #'=')
{
JSC$parser_get_token (stream);
expr = JSC$parser_parse_assignment_expr (stream);
if (!expr)
JSC$parser_syntax_error ();
}
vars.push (new JSC$var_declaration (id, expr));
/* Check if we have more input. */
if (JSC$parser_peek_token (stream) == #',')
{
/* Yes we have. */
JSC$parser_get_token (stream);
/* The next token must be tIDENTIFIER. */
if (JSC$parser_peek_token (stream) != JSC$tIDENTIFIER)
JSC$parser_syntax_error ();
}
else
/* No more input. */
break;
}
/* Must have at least one variable declaration. */
if (vars.length == 0)
JSC$parser_syntax_error ();
}
else if (token != #';')
{
expr1 = JSC$parser_parse_expr (stream);
if (typeof expr1 == "boolean")
JSC$parser_syntax_error ();
}
else
expr1 = null;
token = JSC$parser_get_token (stream);
var for_in = false;
if (token == #';')
{
/* Normal for-statement. */
/* Check */
if (JSC$parser_peek_token (stream) != #';')
{
expr2 = JSC$parser_parse_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
}
else
expr2 = null;
if (JSC$parser_get_token (stream) != #';')
JSC$parser_syntax_error ();
/* Increment */
if (JSC$parser_peek_token (stream) != #')')
{
expr3 = JSC$parser_parse_expr (stream);
if (typeof expr3 == "boolean")
JSC$parser_syntax_error ();
}
else
expr3 = null;
}
else if (token == JSC$tIN)
{
/* The `for (VAR in EXPR)'-statement. */
for_in = true;
if (expr1)
{
/* The first expression must be an identifier. */
if (expr1.etype != JSC$EXPR_IDENTIFIER)
JSC$parser_syntax_error ();
}
else
{
/* We must have only one variable declaration. */
if (vars.length != 1)
JSC$parser_syntax_error ();
}
/* The second expressions. */
expr2 = JSC$parser_parse_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
}
else
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != #')')
JSC$parser_syntax_error ();
/* Stmt. */
stmt = JSC$parser_parse_stmt (stream);
if (typeof stmt == "boolean")
JSC$parser_syntax_error ();
if (for_in)
return new JSC$stmt_for_in (ln, vars, expr1, expr2, stmt);
return new JSC$stmt_for (ln, vars, expr1, expr2, expr3, stmt);
}
return false;
}
function JSC$parser_parse_expr (stream)
{
var expr, expr2;
if (typeof (expr = JSC$parser_parse_assignment_expr (stream))
== "boolean")
return false;
/* Check for the comma expression. */
while (JSC$parser_peek_token (stream) == #',')
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
if (typeof (expr2 = JSC$parser_parse_assignment_expr (stream))
== "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_comma (ln, expr, expr2);
}
return expr;
}
function JSC$parser_parse_assignment_expr (stream)
{
var expr, expr2, token;
if (typeof (expr = JSC$parser_parse_conditional_expr (stream))
== "boolean")
return false;
if (JSC$parser_expr_is_left_hand_side (expr))
{
token = JSC$parser_peek_token (stream);
if (token == #'=' || token == JSC$tMULA
|| token == JSC$tDIVA || token == JSC$tMODA
|| token == JSC$tADDA || token == JSC$tSUBA
|| token == JSC$tLSIA || token == JSC$tRSIA
|| token == JSC$tRRSA || token == JSC$tANDA
|| token == JSC$tXORA || token == JSC$tORA)
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_assignment_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_assignment (ln, token, expr, expr2);
}
}
if (JSC$optimize_constant_folding && expr.constant_folding)
return expr.constant_folding ();
return expr;
}
function JSC$parser_parse_conditional_expr (stream)
{
var expr, expr2, expr3, token;
if (typeof (expr = JSC$parser_parse_logical_or_expr (stream))
== "boolean")
return false;
token = JSC$parser_peek_token (stream);
if (token == #'?')
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_assignment_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != #':')
JSC$parser_syntax_error ();
expr3 = JSC$parser_parse_assignment_expr (stream);
if (typeof expr3 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_quest_colon (ln, expr, expr2, expr3);
}
return expr;
}
function JSC$parser_parse_logical_or_expr (stream)
{
var expr, expr2;
if (typeof (expr = JSC$parser_parse_logical_and_expr (stream))
== "boolean")
return false;
while (JSC$parser_peek_token (stream) == JSC$tOR)
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_logical_and_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_logical_or (ln, expr, expr2);
}
return expr;
}
function JSC$parser_parse_logical_and_expr (stream)
{
var expr, expr2;
if (typeof (expr = JSC$parser_parse_bitwise_or_expr (stream))
== "boolean")
return false;
while (JSC$parser_peek_token (stream) == JSC$tAND)
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_bitwise_or_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_logical_and (ln, expr, expr2);
}
return expr;
}
function JSC$parser_parse_bitwise_or_expr (stream)
{
var expr, expr2;
if (typeof (expr = JSC$parser_parse_bitwise_xor_expr (stream))
== "boolean")
return false;
while (JSC$parser_peek_token (stream) == #'|')
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -