]> git.saurik.com Git - cycript.git/commitdiff
More interactivity and @selector start.
authorJay Freeman (saurik) <saurik@saurik.com>
Thu, 1 Oct 2009 08:19:42 +0000 (08:19 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Thu, 1 Oct 2009 08:19:42 +0000 (08:19 +0000)
Application.mm
Cycript.l
Cycript.y
Library.mm
Output.cpp
Parser.hpp
makefile

index cb12f32c1690972d11fe0d26e7ff87793bfc4c24..cf845709e24f2e3c0517fcea5f6faaf4015c6751 100644 (file)
@@ -3,6 +3,10 @@
 
 int CYConsole(FILE *in, FILE *out, FILE *err);
 
+@ /**/protocol a
+- (void) a:(int)m;
+@end
+
 int main() {
     return CYConsole(stdin, stdout, stderr);
 }
index 6e2a78044f1dd687315b3744652b6ad46c4fb4fb..eb0c692a1d310968c1d74b1a6993bad7dd089746 100644 (file)
--- a/Cycript.l
+++ b/Cycript.l
@@ -9,6 +9,19 @@ typedef cy::parser::token tk;
 #define C T yyextra->state_ = CYClear;
 #define R T yyextra->state_ = CYRestricted;
 #define N if (yyextra->state_ != CYNewLine) { bool restricted(yyextra->state_ == CYRestricted); if (restricted) { yyextra->state_ = CYClear; return tk::NewLine; } else yyextra->state_ = CYNewLine; }
+
+#define YY_INPUT(data, value, size) { \
+    if (yyextra->size_ == 0) \
+        value = YY_NULL; \
+    else { \
+        size_t copy(std::min(size, yyextra->size_)); \
+        memcpy(data, yyextra->data_, copy); \
+        yyextra->data_ += copy; \
+        yyextra->size_ -= copy; \
+        value = copy; \
+    } \
+}
+
 %}
 
 %option prefix="cy"
@@ -82,6 +95,8 @@ Escape   \\['"\\bfnrtv]|\\0|\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}
 "["    C return tk::OpenBracket;
 "]"    C return tk::CloseBracket;
 
+"@selector"  C return tk::AtSelector;
+
 "break"      R yylval->word_ = new CYWord("break"); return tk::Break;
 "case"       C yylval->word_ = new CYWord("case"); return tk::Case;
 "catch"      C yylval->word_ = new CYWord("catch"); return tk::Catch;
index 8d5c2572b66b74a0791675ffa26ffd06adb68900..b7e17eb7bac4fb912bc749c6deaea608a46063d0 100644 (file)
--- a/Cycript.y
+++ b/Cycript.y
@@ -29,6 +29,7 @@ typedef struct {
         CYNumber *number_;
         CYParameter *parameter_;
         CYProperty *property_;
+        CYSelector *selector_;
         CYSource *source_;
         CYStatement *statement_;
         CYString *string_;
@@ -118,6 +119,8 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %token OpenBracket "["
 %token CloseBracket "]"
 
+%token AtSelector "@selector"
+
 %token <word_> Break "break"
 %token <word_> Case "case"
 %token <word_> Catch "catch"
@@ -253,6 +256,9 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <expression_> RelationalExpressionNoBF
 %type <expression_> RelationalExpressionNoIn
 %type <statement_> ReturnStatement
+%type <selector_> SelectorExpression
+%type <selector_> SelectorExpression_
+%type <selector_> SelectorExpressionOpt
 %type <expression_> ShiftExpression
 %type <expression_> ShiftExpressionNoBF
 %type <source_> SourceElement
@@ -1063,8 +1069,23 @@ MessageExpression
     : "[" AssignmentExpression SelectorList "]" { $$ = new(driver.pool_) CYMessage($2, $3); }
     ;
 
+SelectorExpressionOpt
+    : SelectorExpression_ { $$ = $1; }
+    | { $$ = NULL; }
+    ;
+
+SelectorExpression_
+    : WordOpt ":" SelectorExpressionOpt { $$ = new CYSelector($1, true, $3); }
+    ;
+
+SelectorExpression
+    : SelectorExpression_ { $$ = $1; }
+    | Word { $$ = new CYSelector($1, false, NULL); }
+    ;
+
 PrimaryExpression_
     : MessageExpression { $$ = $1; }
+    | "@selector" "(" SelectorExpression ")" { $$ = $3; }
     ;
 /* }}} */
 
index 5a5fdf80b70402e9b0ab930bf9dc7c9702ac427d..1187375933449c6506372bd44342a4dd5aee0a62 100644 (file)
@@ -919,6 +919,8 @@ static JSStaticValue Pointer_staticValues[2] = {
 
 CYDriver::CYDriver(const std::string &filename) :
     state_(CYClear),
+    data_(NULL),
+    size_(0),
     filename_(filename),
     source_(NULL)
 {
@@ -930,9 +932,11 @@ CYDriver::~CYDriver() {
 }
 
 void CYDriver::Clear() {
+    pool_.Clear();
     state_ = CYClear;
+    data_ = NULL;
+    size_ = 0;
     source_.clear();
-    pool_.Clear();
 }
 
 void cy::parser::error(const cy::parser::location_type &loc, const std::string &msg) {
@@ -940,14 +944,33 @@ void cy::parser::error(const cy::parser::location_type &loc, const std::string &
 }
 
 void CYConsole(FILE *fin, FILE *fout, FILE *ferr) {
+    std::string line;
+
+    __gnu_cxx::stdio_filebuf<char> bin(fin, std::ios::in);
+    std::istream sin(&bin);
+
     CYDriver driver("");
 
     while (!feof(fin)) { _pooled
         driver.Clear();
 
+        fputs("cy# ", fout);
+        fflush(fout);
+
         cy::parser parser(driver);
-        if (parser.parse() != 0)
-            continue;
+        std::string command;
+
+        for (;;) {
+            if (!std::getline(sin, line))
+                return;
+            command += line;
+            driver.data_ = command.c_str();
+            driver.size_ = command.size();
+            if (parser.parse() == 0)
+                break;
+            fputs("cy> ", fout);
+            fflush(fout);
+        }
 
         for (std::vector<CYSource *>::const_iterator i(driver.source_.begin()); i != driver.source_.end(); ++i) {
             CYSource *source(*i);
index 9b03d28a9c966dd4b00ab46f9cf711dc4bdf69bc..4e4040a5f00b36ed1fa923f5c85abf571f82325d 100644 (file)
@@ -287,6 +287,12 @@ void CYReturn::Output(std::ostream &out) const {
     out << ';';
 }
 
+void CYSelector::Output(std::ostream &out) const {
+    out << '"';
+    out << "<unimplemented>";
+    out << '"';
+}
+
 void CYSource::Show(std::ostream &out) const {
     for (const CYSource *next(this); next != NULL; next = next->next_)
         next->Output(out);
index 7673ad03dfecdc69892d6e177322969fbe729a43..346fb93271f7f697612fdbe4b945f7936db917b0 100644 (file)
@@ -108,10 +108,16 @@ enum CYState {
 class CYDriver {
   public:
     CYPool pool_;
+
     CYState state_;
+    void *scanner_;
+
+    const char *data_;
+    size_t size_;
+
     std::string filename_;
+
     std::vector<CYSource *> source_;
-    void *scanner_;
 
   private:
     void ScannerInit();
@@ -154,6 +160,23 @@ struct CYLiteral :
 {
 };
 
+struct CYSelector :
+    CYLiteral
+{
+    CYWord *name_;
+    bool value_;
+    CYSelector *after_;
+
+    CYSelector(CYWord *name, bool value, CYSelector *after) :
+        name_(name),
+        value_(value),
+        after_(after)
+    {
+    }
+
+    virtual void Output(std::ostream &out) const;
+};
+
 struct CYString :
     CYLiteral,
     CYName
index a42a78886c8268ad9dc61ea5a76f7c85b02d84f6..d8533dea4e2f2a97f670ba4bdf790591ed72679c 100644 (file)
--- a/makefile
+++ b/makefile
@@ -6,7 +6,7 @@ endif
 
 package:
 
-flags := -mthumb -g0 -O3 -Wall -Werror -I.
+flags := -mthumb -g3 -O0 -Wall -Werror -I.
 
 all: cycript libcycript.dylib libcycript.plist
 
@@ -26,7 +26,7 @@ libcycript.plist: Bridge.def
        done >$@
 
 Cycript.tab.cc Cycript.tab.hh location.hh position.hh: Cycript.y
-       bison --report=state $<
+       bison -v --report=state $<
 
 lex.cy.c: Cycript.l
        flex $<