From 800522aac030b409e0d099c30bb6753da32379db Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Tue, 9 Jan 2024 11:43:39 +0000 Subject: [PATCH] JSIL front-end: make parser and lexer reentrant This avoids hand-crafted init functions with possibly insufficient guards against reentrant use and also removes (file-local) global variables. --- src/jsil/jsil_parser.cpp | 13 ++ src/jsil/jsil_parser.h | 12 +- src/jsil/parser.y | 28 ++--- src/jsil/scanner.l | 257 +++++++++++++++++++-------------------- 4 files changed, 155 insertions(+), 155 deletions(-) diff --git a/src/jsil/jsil_parser.cpp b/src/jsil/jsil_parser.cpp index 234f65102120..e76b217198d6 100644 --- a/src/jsil/jsil_parser.cpp +++ b/src/jsil/jsil_parser.cpp @@ -10,3 +10,16 @@ Author: Michael Tautschnig, tautschn@amazon.com /// Jsil Language #include "jsil_parser.h" + +int yyjsillex_init_extra(jsil_parsert *, void **); +int yyjsillex_destroy(void *); +int yyjsilparse(jsil_parsert &, void *); + +bool jsil_parsert::parse() +{ + void *scanner; + yyjsillex_init_extra(this, &scanner); + bool parse_fail = yyjsilparse(*this, scanner) != 0; + yyjsillex_destroy(scanner); + return parse_fail; +} diff --git a/src/jsil/jsil_parser.h b/src/jsil/jsil_parser.h index c77e492259be..81de9b55503f 100644 --- a/src/jsil/jsil_parser.h +++ b/src/jsil/jsil_parser.h @@ -16,10 +16,6 @@ Author: Michael Tautschnig, tautschn@amazon.com #include "jsil_parse_tree.h" -class jsil_parsert; -int yyjsilparse(jsil_parsert &); -void jsil_scanner_init(jsil_parsert &); - class jsil_parsert:public parsert { public: @@ -30,13 +26,9 @@ class jsil_parsert:public parsert jsil_parse_treet parse_tree; - virtual bool parse() override - { - jsil_scanner_init(*this); - return yyjsilparse(*this) != 0; - } + bool parse() override; - virtual void clear() override + void clear() override { parsert::clear(); parse_tree.clear(); diff --git a/src/jsil/parser.y b/src/jsil/parser.y index 31c96d972edd..05dea8d01733 100644 --- a/src/jsil/parser.y +++ b/src/jsil/parser.y @@ -1,24 +1,19 @@ %{ // #define YYDEBUG 1 -#define PARSER (*jsil_parser) +#define PARSER jsil_parser #include "jsil_parser.h" -int yyjsillex(); -extern char *yyjsiltext; +int yyjsillex(unsigned *, void *); +char *yyjsilget_text(void *); -static jsil_parsert *jsil_parser; -int yyjsilparse(void); -int yyjsilparse(jsil_parsert &_jsil_parser) +int yyjsilerror( + jsil_parsert &jsil_parser, + void *scanner, + const std::string &error) { - jsil_parser = &_jsil_parser; - return yyjsilparse(); -} - -int yyjsilerror(const std::string &error) -{ - jsil_parser->parse_error(error, yyjsiltext); + jsil_parser.parse_error(error, yyjsilget_text(scanner)); return 0; } @@ -43,9 +38,14 @@ int yyjsilerror(const std::string &error) // unreachable code #pragma warning(disable:4702) #endif +%} + +%define api.pure full +%parse-param {jsil_parsert &jsil_parser} +%parse-param {void *scanner} +%lex-param {void *scanner} /*** token declaration **************************************************/ -%} /*** special scanner reports ***/ diff --git a/src/jsil/scanner.l b/src/jsil/scanner.l index 4ec6cef93360..1edbe9e524b3 100755 --- a/src/jsil/scanner.l +++ b/src/jsil/scanner.l @@ -3,6 +3,10 @@ %option nounistd %option never-interactive %option stack +%option noyywrap +%option reentrant +%option bison-bridge +%option extra-type="jsil_parsert *" %{ @@ -17,32 +21,28 @@ #include #include -#define PARSER (*jsil_parser) +#define PARSER (*yyjsilget_extra(yyscanner)) #define YYSTYPE unsigned #include "jsil_parser.h" #include "jsil_y.tab.h" // extern int yyjsildebug; -static jsil_parsert *jsil_parser; -void jsil_scanner_init(jsil_parsert &_jsil_parser) -{ - jsil_parser = &_jsil_parser; - YY_FLUSH_BUFFER; - BEGIN(0); -} - -int yyjsilerror(const std::string &error); +int yyjsilerror(jsil_parsert &, void *, const std::string &); +#define yyjsillval (*yylval_param) #define loc() \ { newstack(yyjsillval); PARSER.set_source_location(parser_stack(yyjsillval)); } -static int make_identifier() +jsil_parsert *yyjsilget_extra(void *); +char *yyjsilget_text(void *); + +static int make_identifier(YYSTYPE *yylval_param, void *yyscanner) { loc(); // this hashes the identifier - irep_idt base_name=yytext; + irep_idt base_name=yyjsilget_text(yyscanner); parser_stack(yyjsillval).id(ID_symbol); parser_stack(yyjsillval).set(ID_C_base_name, base_name); @@ -92,25 +92,25 @@ string_lit ["]{s_char}*["] { "/*" { - yy_push_state(COMMENT); /* begin comment state */ + yy_push_state(COMMENT, yyscanner); /* begin comment state */ // make the compiler happy - (void)yy_top_state(); + (void)yy_top_state(yyscanner); } } { - "*/" { yy_pop_state(); } /* end comment state, back to GRAMMAR */ - "/*" { yyjsilerror("Probably nested comments"); } - <> { yyjsilerror("Unterminated comment"); return TOK_SCANNER_ERROR; } + "*/" { yy_pop_state(yyscanner); } /* end comment state, back to GRAMMAR */ + "/*" { yyjsilerror(PARSER, yyscanner, "Probably nested comments"); } + <> { yyjsilerror(PARSER, yyscanner, "Unterminated comment"); return TOK_SCANNER_ERROR; } [^*/\n]* { } /* ignore every char except '*' and NL (performance!) */ . { } /* all single characters within comments are ignored */ \n { } } { - "*/" { yy_pop_state(); } /* end comment state, back to STRING_LITERAL */ - "/*" { yyjsilerror("Probably nested comments"); } - <> { yyjsilerror("Unterminated comment"); return TOK_SCANNER_ERROR; } + "*/" { yy_pop_state(yyscanner); } /* end comment state, back to STRING_LITERAL */ + "/*" { yyjsilerror(PARSER, yyscanner, "Probably nested comments"); } + <> { yyjsilerror(PARSER, yyscanner, "Unterminated comment"); return TOK_SCANNER_ERROR; } [^*/\n]* { } /* ignore every char except '*' and NL (performance!) */ . { } /* all single characters within comments are ignored */ \n { } @@ -123,84 +123,84 @@ string_lit ["]{s_char}*["] newstack(yyjsillval); PARSER.set_source_location(parser_stack(yyjsillval)); // String literals can be continued - yy_push_state(STRING_LITERAL); + yy_push_state(STRING_LITERAL, yyscanner); } } { {string_lit} { PARSER.string_literal.append(yytext); } {whitespace} { } /* ignore */ - "/*" { yy_push_state(STRING_LITERAL_COMMENT); } /* C comment, ignore */ + "/*" { yy_push_state(STRING_LITERAL_COMMENT, yyscanner); } /* C comment, ignore */ {newline}|. { // anything else: back to normal source_locationt l=parser_stack(yyjsillval).source_location(); parser_stack(yyjsillval)=convert_string_literal(PARSER.string_literal); parser_stack(yyjsillval).add_source_location().swap(l); - yy_pop_state(); // back to normal + yy_pop_state(yyscanner); // back to normal yyless(0); // put back return TOK_STRING; } } { - "#global_is_nan" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#global_is_finite" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#boolean_call" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#boolean_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#boolean_prototype_to_string" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#boolean_prototype_value_of" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#object_call" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#object_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#object_prototype_to_string" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#object_prototype_value_of" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#object_prototype_is_prototype_of" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#object_get_prototype_of" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#number_call" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#number_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#number_prototype_to_string" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#number_prototype_value_of" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#string_call" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#string_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#string_prototype_to_string" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#string_prototype_value_of" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#error_call_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#terror_call_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#rerror_call_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#serror_call_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#evalerror_call_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#rangeerror_call_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#urierror_call_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#function_call" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#function_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#function_protottype_call" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#array_call" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - "#array_construct" { make_identifier(); return TOK_BUILTIN_IDENTIFIER; } - - "#[[GetOwnPropertyDefault]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[GetOwnPropertyString]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#GetValue" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#PutValue" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[Get]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[GetDefault]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[GetFunction]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[Put]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[HasProperty]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[DefaultValue]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[DefineOwnPropery]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[DefineOwnProperyDefault]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#[[DefineOwnProperyArray]]" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#ToPrimitive" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#ToBoolean" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#ToNumber" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#ToNumberPrim" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#ToUint32" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#ToString" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#ToStringPrim" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#ToObject" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#CheckObjectCoercible" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#IsCallable" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#AbstractRelation" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#StrictEquality" { make_identifier(); return TOK_SPEC_IDENTIFIER; } - "#StrictEqualitySameType" { make_identifier(); return TOK_SPEC_IDENTIFIER; } + "#global_is_nan" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#global_is_finite" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#boolean_call" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#boolean_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#boolean_prototype_to_string" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#boolean_prototype_value_of" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#object_call" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#object_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#object_prototype_to_string" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#object_prototype_value_of" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#object_prototype_is_prototype_of" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#object_get_prototype_of" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#number_call" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#number_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#number_prototype_to_string" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#number_prototype_value_of" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#string_call" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#string_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#string_prototype_to_string" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#string_prototype_value_of" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#error_call_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#terror_call_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#rerror_call_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#serror_call_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#evalerror_call_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#rangeerror_call_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#urierror_call_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#function_call" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#function_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#function_protottype_call" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#array_call" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + "#array_construct" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_IDENTIFIER; } + + "#[[GetOwnPropertyDefault]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[GetOwnPropertyString]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#GetValue" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#PutValue" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[Get]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[GetDefault]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[GetFunction]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[Put]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[HasProperty]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[DefaultValue]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[DefineOwnPropery]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[DefineOwnProperyDefault]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#[[DefineOwnProperyArray]]" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#ToPrimitive" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#ToBoolean" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#ToNumber" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#ToNumberPrim" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#ToUint32" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#ToString" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#ToStringPrim" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#ToObject" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#CheckObjectCoercible" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#IsCallable" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#AbstractRelation" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#StrictEquality" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } + "#StrictEqualitySameType" { make_identifier(yylval_param, yyscanner); return TOK_SPEC_IDENTIFIER; } } { @@ -216,7 +216,7 @@ string_lit ["]{s_char}*["] /*** scanner parsed tokens (these have a value!) ***/ - {identifier} { return make_identifier(); } + {identifier} { return make_identifier(yylval_param, yyscanner); } "{" { loc(); BEGIN(STATEMENTS); return '{'; } /* This catches all one-character operators */ @@ -286,7 +286,7 @@ string_lit ["]{s_char}*["] /*** scanner parsed tokens (these have a value!) ***/ - {identifier} { return make_identifier(); } + {identifier} { return make_identifier(yylval_param, yyscanner); } {float}|{integer} { newstack(yyjsillval); @@ -295,48 +295,48 @@ string_lit ["]{s_char}*["] return TOK_FLOATING; } - "#lg" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lg_isNan" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lg_isFinite" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lop" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lop_toString" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lop_valueOf" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lop_isPrototypeOf" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lfunction" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lfp" { make_identifier(); return TOK_BUILTIN_LOC; } - "#leval" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lerror" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lep" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lrerror" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lrep" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lterror" { make_identifier(); return TOK_BUILTIN_LOC; } - "#ltep" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lserror" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lsep" { make_identifier(); return TOK_BUILTIN_LOC; } - "#levalerror" { make_identifier(); return TOK_BUILTIN_LOC; } - "#levalerrorp" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lrangeerror" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lrangeerrorp" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lurierror" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lurierrorp" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lobject" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lobject_get_prototype_of" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lboolean" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lbp" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lbp_toString" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lbp_valueOf" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lnumber" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lnp" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lnp_toString" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lnp_valueOf" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lmath" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lstring" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lsp" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lsp_toString" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lsp_valueOf" { make_identifier(); return TOK_BUILTIN_LOC; } - "#larray" { make_identifier(); return TOK_BUILTIN_LOC; } - "#lap" { make_identifier(); return TOK_BUILTIN_LOC; } - "#ljson" { make_identifier(); return TOK_BUILTIN_LOC; } + "#lg" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lg_isNan" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lg_isFinite" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lop" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lop_toString" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lop_valueOf" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lop_isPrototypeOf" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lfunction" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lfp" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#leval" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lerror" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lep" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lrerror" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lrep" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lterror" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#ltep" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lserror" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lsep" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#levalerror" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#levalerrorp" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lrangeerror" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lrangeerrorp" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lurierror" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lurierrorp" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lobject" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lobject_get_prototype_of" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lboolean" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lbp" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lbp_toString" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lbp_valueOf" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lnumber" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lnp" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lnp_toString" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lnp_valueOf" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lmath" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lstring" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lsp" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lsp_toString" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lsp_valueOf" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#larray" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#lap" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } + "#ljson" { make_identifier(yylval_param, yyscanner); return TOK_BUILTIN_LOC; } "}" { loc(); BEGIN(GRAMMAR); return '}'; } /* This catches all one-character operators */ @@ -344,8 +344,3 @@ string_lit ["]{s_char}*["] } <> { yyterminate(); /* done! */ } - -%% - -int yywrap() { return 1; } -