📄 compiler.js
字号:
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_bitwise_xor_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_bitwise_or (ln, expr, expr2);
}
return expr;
}
function JSC$parser_parse_bitwise_xor_expr (stream)
{
var expr, expr2;
if (typeof (expr = JSC$parser_parse_bitwise_and_expr (stream))
== "boolean")
return false;
while (JSC$parser_peek_token (stream) == #'^')
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_bitwise_and_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_bitwise_xor (ln, expr, expr2);
}
return expr;
}
function JSC$parser_parse_bitwise_and_expr (stream)
{
var expr, expr2;
if (typeof (expr = JSC$parser_parse_equality_expr (stream))
== "boolean")
return false;
while (JSC$parser_peek_token (stream) == #'&')
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_equality_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_bitwise_and (ln, expr, expr2);
}
return expr;
}
function JSC$parser_parse_equality_expr (stream)
{
var expr, expr2, token;
if (typeof (expr = JSC$parser_parse_relational_expr (stream))
== "boolean")
return false;
token = JSC$parser_peek_token (stream);
while (token == JSC$tEQUAL || token == JSC$tNEQUAL
|| token == JSC$tSEQUAL || token == JSC$tSNEQUAL)
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_relational_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_equality (ln, token, expr, expr2);
token = JSC$parser_peek_token (stream);
}
return expr;
}
function JSC$parser_parse_relational_expr (stream)
{
var expr, expr2, token;
if (typeof (expr = JSC$parser_parse_shift_expr (stream))
== "boolean")
return false;
token = JSC$parser_peek_token (stream);
while (token == #'<' || token == #'>' || token == JSC$tLE
|| token == JSC$tGE)
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_shift_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_relational (ln, token, expr, expr2);
token = JSC$parser_peek_token (stream);
}
return expr;
}
function JSC$parser_parse_shift_expr (stream)
{
var expr, expr2, token;
if (typeof (expr = JSC$parser_parse_additive_expr (stream))
== "boolean")
return false;
token = JSC$parser_peek_token (stream);
while (token == JSC$tLSHIFT || token == JSC$tRSHIFT || token == JSC$tRRSHIFT)
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_additive_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_shift (ln, token, expr, expr2);
token = JSC$parser_peek_token (stream);
}
return expr;
}
function JSC$parser_parse_additive_expr (stream)
{
var expr, expr2, token;
if (typeof (expr = JSC$parser_parse_multiplicative_expr (stream))
== "boolean")
return false;
token = JSC$parser_peek_token (stream);
while (token == #'+' || token == #'-')
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_multiplicative_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_additive (ln, token, expr, expr2);
token = JSC$parser_peek_token (stream);
}
return expr;
}
function JSC$parser_parse_multiplicative_expr (stream)
{
var expr, expr2, token;
if (typeof (expr = JSC$parser_parse_unary_expr (stream)) == "boolean")
return false;
token = JSC$parser_peek_token (stream);
while (token == #'*' || token == #'/' || token == #'%')
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr2 = JSC$parser_parse_unary_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_multiplicative (ln, token, expr, expr2);
token = JSC$parser_peek_token (stream);
}
return expr;
}
function JSC$parser_parse_unary_expr (stream)
{
var expr, token;
token = JSC$parser_peek_token (stream);
if (token == JSC$tDELETE
|| token == JSC$tVOID
|| token == JSC$tTYPEOF
|| token == JSC$tPLUSPLUS
|| token == JSC$tMINUSMINUS
|| token == #'+'
|| token == #'-'
|| token == #'~'
|| token == #'!')
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr = JSC$parser_parse_unary_expr (stream);
if (typeof expr == "boolean")
JSC$parser_syntax_error ();
return new JSC$expr_unary (ln, token, expr);
}
return JSC$parser_parse_postfix_expr (stream);
}
function JSC$parser_parse_postfix_expr (stream)
{
var expr, token;
if (typeof (expr = JSC$parser_parse_left_hand_side_expr (stream))
== "boolean")
return false;
token = JSC$parser_peek_token (stream);
if (token == JSC$tPLUSPLUS || token == JSC$tMINUSMINUS)
{
if (JSC$parser_peek_token_linenum > JSC$parser_token_linenum)
{
if (JSC$warn_missing_semicolon)
JSC$warning (JSC$filename + ":"
+ JSC$parser_token_linenum.toString ()
+ ": warning: automatic semicolon insertion cuts the expression before ++ or --");
}
else
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
return new JSC$expr_postfix (ln, token, expr);
}
}
return expr;
}
function JSC$parser_parse_left_hand_side_expr (stream)
{
var expr, args, token, expr2;
if (typeof (expr = JSC$parser_parse_member_expr (stream))
== "boolean")
return false;
/* Parse the possible first pair of arguments. */
if (JSC$parser_peek_token (stream) == #'(')
{
var ln = JSC$parser_peek_token_linenum;
args = JSC$parser_parse_arguments (stream);
if (typeof args == "boolean")
JSC$parser_syntax_error ();
expr = new JSC$expr_call (ln, expr, args);
}
else
return expr;
/* Parse to possibly following arguments and selectors. */
while ((token = JSC$parser_peek_token (stream)) == #'('
|| token == #'[' || token == #'.')
{
var ln = JSC$parser_peek_token_linenum;
if (token == #'(')
{
args = JSC$parser_parse_arguments (stream);
expr = new JSC$expr_call (ln, expr, args);
}
else if (token == #'[')
{
JSC$parser_get_token (stream);
expr2 = JSC$parser_parse_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != #']')
JSC$parser_syntax_error ();
expr = new JSC$expr_object_array (ln, expr, expr2);
}
else
{
JSC$parser_get_token (stream);
if (JSC$parser_get_token (stream) != JSC$tIDENTIFIER)
JSC$parser_syntax_error ();
expr = new JSC$expr_object_property (ln, expr,
JSC$parser_token_value);
}
}
return expr;
}
function JSC$parser_parse_member_expr (stream)
{
var expr, args, token, expr2;
if (typeof (expr = JSC$parser_parse_primary_expr (stream))
== "boolean")
{
token = JSC$parser_peek_token (stream);
if (token == JSC$tNEW)
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
expr = JSC$parser_parse_member_expr (stream);
if (typeof expr == "boolean")
JSC$parser_syntax_error ();
if (JSC$parser_peek_token (stream) == #'(')
{
args = JSC$parser_parse_arguments (stream);
if (typeof args == "boolean")
JSC$parser_syntax_error ();
}
else
return new JSC$expr_new (ln, expr, null);
expr = new JSC$expr_new (ln, expr, args);
}
else
return false;
}
/* Ok, now we have valid starter. */
token = JSC$parser_peek_token (stream);
while (token == #'[' || token == #'.')
{
JSC$parser_get_token (stream);
var ln = JSC$parser_token_linenum;
if (token == #'[')
{
expr2 = JSC$parser_parse_expr (stream);
if (typeof expr2 == "boolean")
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != #']')
JSC$parser_syntax_error ();
expr = new JSC$expr_object_array (ln, expr, expr2);
}
else
{
if (JSC$parser_get_token (stream) != JSC$tIDENTIFIER)
JSC$parser_syntax_error ();
expr = new JSC$expr_object_property (ln, expr,
JSC$parser_token_value);
}
token = JSC$parser_peek_token (stream);
}
return expr;
}
function JSC$parser_parse_primary_expr (stream)
{
var token, val;
token = JSC$parser_peek_token (stream);
var ln = JSC$parser_peek_token_linenum;
if (token == JSC$tTHIS)
val = new JSC$expr_this (ln);
else if (token == JSC$tIDENTIFIER)
val = new JSC$expr_identifier (ln, JSC$parser_peek_token_value);
else if (token == JSC$tFLOAT)
val = new JSC$expr_float (ln, JSC$parser_peek_token_value);
else if (token == JSC$tINTEGER)
val = new JSC$expr_integer (ln, JSC$parser_peek_token_value);
else if (token == JSC$tSTRING)
val = new JSC$expr_string (ln, JSC$parser_peek_token_value);
else if (token == #'/')
{
/*
* Kludge alert! The regular expression constants (/.../) and
* div operands are impossible to distinguish, based only on the
* lexical analysis. Therefore, we need some syntactical
* knowledge when the regular expression constants are possible
* at all. This is the place where they can appear. In all
* other places, the character `/' is interpreted as a div
* operator.
*/
JSC$parser_get_token (stream);
return new JSC$expr_regexp (ln, JSC$lexer_read_regexp_constant (stream));
}
else if (token == JSC$tNULL)
val = new JSC$expr_null (ln);
else if (token == JSC$tTRUE)
val = new JSC$expr_true (ln);
else if (token == JSC$tFALSE)
val = new JSC$expr_false (ln);
else if (token == #'[')
{
/* Array initializer. */
/* TODO: SharpVarDefinition_{opt} */
JSC$parser_get_token (stream);
var items = new Array ();
var pos = 0;
while ((token = JSC$parser_peek_token (stream)) != #']')
{
if (token == #',')
{
JSC$parser_get_token (stream);
items[++pos] = false;
continue;
}
var expr = JSC$parser_parse_assignment_expr (stream);
if (!expr)
JSC$parser_syntax_error ();
items[pos] = expr;
/* Got one expression. It must be followed by ',' or ']'. */
token = JSC$parser_peek_token (stream);
if (token != #',' && token != #']')
JSC$parser_syntax_error ();
}
val = new JSC$expr_array_initializer (ln, items);
}
else if (token == #'{')
{
/* Object literal. */
/* TODO: SharpVarDefinition_{opt} */
JSC$parser_get_token (stream);
var items = new Array ();
while ((token = JSC$parser_peek_token (stream)) != #'}')
{
var pair = new Object ();
token = JSC$parser_get_token (stream);
pair.linenum = JSC$linenum;
pair.id_type = token;
pair.id = JSC$parser_token_value;
if (token != JSC$tIDENTIFIER && token != JSC$tSTRING
&& token != JSC$tINTEGER)
JSC$parser_syntax_error ();
if (JSC$parser_get_token (stream) != #':')
JSC$parser_syntax_error ();
pair.expr = JSC$parser_parse_assignment_expr (stream);
if (!pair.expr)
JSC$parser_syntax_error ();
items.push (pair);
/*
* Got one property, initializer pair. It must be followed
* by ',' or '}'.
*/
token = JSC$parser_peek_token (stream);
if (token == #',')
{
/* Ok, we have more items. */
JSC$parser_get_token (stream);
token = JSC$parser_peek_token (stream);
if (token != JSC$tIDENTIFIER && token != JSC$tSTRING
&& token != JSC$tINTEGER)
JSC$parser_syntax_error ();
}
else if (token != #'}' && token)
JSC$parser_syntax_error ();
}
val = new JSC$expr_object_initializer (ln, items);
}
else if (token == #'(')
{
JSC$parser_get_token (stream);
val = JSC$parser_parse_expr (stream);
if (typeof val == "boolean"
|| JSC$parser_peek_token (stream) != #')')
JSC$parser_syntax_error ();
}
else
return false;
JSC$parser_get_token (stream);
return val;
}
function JSC$parser_parse_arguments (stream)
{
var args, item;
if (JSC$parser_peek_token (stream) != #'(')
return false;
args = new Array ();
JSC$par
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -