]> git.saurik.com Git - cycript.git/commitdiff
Implemented YUI /*! ... */ documentation comments.
authorJay Freeman (saurik) <saurik@saurik.com>
Sun, 15 Nov 2009 21:51:22 +0000 (21:51 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Sun, 15 Nov 2009 21:51:22 +0000 (21:51 +0000)
Cycript.l.in
Cycript.y.in
Output.cpp
Parser.hpp
Replace.cpp

index 7323e251cb9b95c920346be8fbba69842af36c4e..91e6a633827408d295324d0d8406543bcb5f7288 100644 (file)
@@ -161,6 +161,7 @@ XMLName {XMLNameStart}{XMLNamePart}*
 <RegExp>\/{RegularExpressionBody}\/{RegularExpressionFlags} E("")
 
 \/\/[^\n]* L
+\/\*!(\n|[^\*]|\*[^/])*\*\/ V() C yylval->comment_ = new(yyextra->pool_) CYComment(apr_pstrmemdup(yyextra->pool_, yytext, yyleng)); return tk::Comment;
 \/\*(\n|[^\*]|\*[^/])*\*\/ V(N)
 
 @begin E4X
index 79d277da4a7b96580f1fc94fab50cd41a45ddb92..e22535dc86c9ea2992b100a46ca28354e2b8d905 100644 (file)
@@ -67,6 +67,7 @@ typedef struct {
         CYBoolean *boolean_;
         CYClause *clause_;
         cy::Syntax::Catch *catch_;
+        CYComment *comment_;
         CYComprehension *comprehension_;
         CYCompound *compound_;
         CYDeclaration *declaration_;
@@ -209,6 +210,8 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %token SemiColon ";"
 %token NewLine "\n"
 
+%token <comment_> Comment
+
 %token OpenParen "("
 %token CloseParen ")"
 
@@ -1601,6 +1604,12 @@ MemberAccess
 /* }}} */
 @end
 
+/* YUI: Documentation Comments {{{ */
+Statement_
+    : Comment { $$ = $1; }
+    ;
+/* }}} */
+
 @begin E4X
 /* Lexer State {{{ */
 LexPushRegExp
index 9ffc4f67037e790067db5ce971bd00d503f0eb94..04f893c9299d74671fb812a04a1975ed40ee2980 100644 (file)
@@ -85,14 +85,24 @@ CYOutput &CYOutput::operator <<(char rhs) {
             for (unsigned i(0); i != indent_; ++i)
                 out_ << "    ";
         else goto done;
-    else goto work;
+    else if (rhs == '\r') {
+        if (right_) {
+            out_ << '\n';
+            right_ = false;
+            goto mode;
+        }
+    } else goto work;
 
+    right_ = true;
+  mode:
     mode_ = NoMode;
     goto done;
 
   work:
-    if (mode_ == Terminated && rhs != '}')
+    if (mode_ == Terminated && rhs != '}') {
+        right_ = true;
         out_ << ';';
+    }
 
     if (rhs == ';') {
         if (pretty_)
@@ -116,6 +126,7 @@ CYOutput &CYOutput::operator <<(char rhs) {
     } else none:
         mode_ = NoMode;
 
+    right_ = true;
     out_ << rhs;
   done:
     return *this;
@@ -141,6 +152,7 @@ CYOutput &CYOutput::operator <<(const char *rhs) {
     else
         mode_ = NoMode;
 
+    right_ = true;
     out_ << rhs;
     return *this;
 }
@@ -222,6 +234,12 @@ void Catch::Output(CYOutput &out) const {
 
 } }
 
+void CYComment::Output(CYOutput &out, CYFlags flags) const {
+    out << '\r';
+    out << value_;
+    out << '\r';
+}
+
 void CYCompound::Output(CYOutput &out, CYFlags flags) const {
     if (CYExpression *expression = expressions_)
         if (CYExpression *next = expression->next_) {
index a76faaa0c1df4398eb34c3164bb5eda0c376a696..8f42bc367582e792cfaf608a7498b2b8752dbfad 100644 (file)
@@ -83,6 +83,7 @@ struct CYOutput {
     std::ostream &out_;
     bool pretty_;
     unsigned indent_;
+    bool right_;
 
     enum {
         NoMode,
@@ -96,6 +97,7 @@ struct CYOutput {
         out_(out),
         pretty_(false),
         indent_(0),
+        right_(false),
         mode_(NoMode)
     {
     }
@@ -251,6 +253,20 @@ struct CYIdentifier :
     }
 };
 
+struct CYComment :
+    CYStatement
+{
+    const char *value_;
+
+    CYComment(const char *value) :
+        value_(value)
+    {
+    }
+
+    virtual CYStatement *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 struct CYLabel :
     CYStatement
 {
index b41aac1d959ed7133164e0b93b51d91e59c88382..80391180ecb1a5556625a203aae79ac043fba287 100644 (file)
@@ -134,6 +134,10 @@ void CYClause::Replace(CYContext &context) { $T()
     next_->Replace(context);
 }
 
+CYStatement *CYComment::Replace(CYContext &context) {
+    return NULL;
+}
+
 CYExpression *CYCompound::Replace(CYContext &context) {
     expressions_ = expressions_->ReplaceAll(context);
     return NULL;