]> git.saurik.com Git - cycript.git/commitdiff
The glue code required for Bison/Flex parsers is insane.
authorJay Freeman (saurik) <saurik@saurik.com>
Tue, 29 Sep 2009 23:08:23 +0000 (23:08 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Tue, 29 Sep 2009 23:08:23 +0000 (23:08 +0000)
Cycript.l
Cycript.y
Library.mm
Parser.hpp

index 2467b96fad0cdd371af8af1f8bb3769c2a241c90..b1aa8a645fadbafae50774fef9863ba0e3f52e7a 100644 (file)
--- a/Cycript.l
+++ b/Cycript.l
@@ -1,6 +1,7 @@
 %{
 #include "Cycript.tab.hh"
 typedef cy::parser::token tk;
+#define YY_EXTRA_TYPE CYParser *
 %}
 
 %option prefix="cy"
@@ -10,6 +11,7 @@ typedef cy::parser::token tk;
 %option yylineno
 %option nounput
 %option interactive
+%option reentrant
 
 delim         [ \t]
 whitesp       {delim}+
@@ -65,8 +67,10 @@ number        [-]?{digit}*[.]?{digit}+
 
 "("    return tk::OpenParen;
 ")"    return tk::CloseParen;
+
 "{"    return tk::OpenBrace;
 "}"    return tk::CloseBrace;
+
 "["    return tk::OpenBracket;
 "]"    return tk::CloseBracket;
 
@@ -103,3 +107,14 @@ number        [-]?{digit}*[.]?{digit}+
 [0-9]+                   return tk::NumericLiteral;
 
 [ \t\n]                  ;
+
+%%
+
+void CYParser::ScannerInit() {
+    cylex_init(&scanner_);
+    cyset_extra(this, scanner_);
+}
+
+void CYParser::ScannerDestroy() {
+    cylex_destroy(scanner_);
+}
index 9ccf4e09402700eacad8fd85c77167b62bb80e05..0ecb777b42b9fd0b4cc72c355856e9592373ed95 100644 (file)
--- a/Cycript.y
+++ b/Cycript.y
@@ -1,6 +1,7 @@
 %code top {
 #include "Cycript.tab.hh"
-int cylex(YYSTYPE *lvalp, YYLTYPE *llocp);
+int cylex(YYSTYPE *lvalp, YYLTYPE *llocp, void *scanner);
+#define scanner driver->scanner_
 }
 
 %code requires {
@@ -25,7 +26,8 @@ int cylex(YYSTYPE *lvalp, YYLTYPE *llocp);
 %debug
 %error-verbose
 
-%parse-param { CYParser *context }
+%parse-param { CYParser *driver }
+%lex-param { void *scanner }
 
 %token Ampersand "&"
 %token AmpersandAmpersand "&&"
@@ -74,8 +76,10 @@ int cylex(YYSTYPE *lvalp, YYLTYPE *llocp);
 
 %token OpenParen "("
 %token CloseParen ")"
+
 %token OpenBrace "{"
 %token CloseBrace "}"
+
 %token OpenBracket "["
 %token CloseBracket "]"
 
index 3de8415c408995bfd5ef29c7962017f8e5062d28..140d167f2f578584ae62e425f5fe074240db7462 100644 (file)
@@ -952,6 +952,14 @@ static JSStaticValue Pointer_staticValues[2] = {
     {NULL, NULL, NULL, 0}
 };
 
+CYParser::CYParser() {
+    ScannerInit();
+}
+
+CYParser::~CYParser() {
+    ScannerDestroy();
+}
+
 extern int cydebug;
 
 void cy::parser::error(const cy::parser::location_type &loc, const std::string &msg) {
@@ -960,8 +968,8 @@ void cy::parser::error(const cy::parser::location_type &loc, const std::string &
 
 void CYConsole(FILE *fin, FILE *fout, FILE *ferr) {
     cydebug = 1;
-    CYParser context;
-    cy::parser parser(&context);
+    CYParser driver;
+    cy::parser parser(&driver);
     parser.parse();
 }
 
index e0ed1f18d525222320ae194f2e3e058d7484fc1b..7878b0f12423193a2203cfeb8d8f65c7817c0632 100644 (file)
@@ -2,6 +2,16 @@
 #define CYPARSER_HPP
 
 class CYParser {
+  public:
+    void *scanner_;
+
+  private:
+    void ScannerInit();
+    void ScannerDestroy();
+
+  public:
+    CYParser();
+    ~CYParser();
 };
 
 struct CYExpression {