]> git.saurik.com Git - cycript.git/blob - Cycript.l
45dbe3eb676e8901baa83134ed77b98c10a0812b
[cycript.git] / Cycript.l
1 %{
2 #include "Cycript.tab.hh"
3 typedef cy::parser::token tk;
4 #define YY_EXTRA_TYPE CYDriver *
5 #define N yylval->newline_ = yyextra->newline_; yyextra->newline_ = false; yyextra->restricted_ = false;
6 #define R yyextra->restricted_ = true;
7 #define L { bool restricted(yyextra->restricted_); yyextra->restricted_ = false; if (restricted) return tk::NewLine; else yyextra->newline_ = true; }
8 %}
9
10 %option prefix="cy"
11 %option bison-bridge
12 %option bison-locations
13 %option noyywrap
14 %option yylineno
15 %option nounput
16 %option interactive
17 %option reentrant
18
19 Exponent [eE][+-]?[0-9]+
20 Escape \\['"\\bfnrtv]|\\0|\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}
21
22 %%
23
24 \/\/[^\n]* ;
25 \/\*(\n|[^\*]|\*[^/])\*\/ if (memchr(yytext, '\n', yyleng) != NULL) L // XXX: supposedly I will be screwed on very very long multi-line comments and need to replace this with a manual lexer. http://websrv.cs.fsu.edu/~engelen/courses/COP5621/Pr2.pdf ; XXX: this rule doesn't work anyway, fucking A :(
26
27 "&" N return tk::Ampersand;
28 "&&" N return tk::AmpersandAmpersand;
29 "&=" N return tk::AmpersandEqual;
30 "^" N return tk::Carrot;
31 "^=" N return tk::CarrotEqual;
32 "=" N return tk::Equal;
33 "==" N return tk::EqualEqual;
34 "===" N return tk::EqualEqualEqual;
35 "!" N return tk::Exclamation;
36 "!=" N return tk::ExclamationEqual;
37 "!==" N return tk::ExclamationEqualEqual;
38 "-" N return tk::Hyphen;
39 "-=" N return tk::HyphenEqual;
40 "--" N return yylval->newline_ ? tk::HyphenHyphen_ : tk::HyphenHyphen;
41 "->" N return tk::HyphenRight;
42 "<" N return tk::Left;
43 "<=" N return tk::LeftEqual;
44 "<<" N return tk::LeftLeft;
45 "<<=" N return tk::LeftLeftEqual;
46 "%" N return tk::Percent;
47 "%=" N return tk::PercentEqual;
48 "." N return tk::Period;
49 "|" N return tk::Pipe;
50 "|=" N return tk::PipeEqual;
51 "||" N return tk::PipePipe;
52 "+" N return tk::Plus;
53 "+=" N return tk::PlusEqual;
54 "++" N return yylval->newline_ ? tk::PlusPlus_ : tk::PlusPlus;
55 ">" N return tk::Right;
56 ">=" N return tk::RightEqual;
57 ">>" N return tk::RightRight;
58 ">>=" N return tk::RightRightEqual;
59 ">>>" N return tk::RightRightRight;
60 ">>>=" N return tk::RightRightRightEqual;
61 "/" N return tk::Slash;
62 "/=" N return tk::SlashEqual;
63 "*" N return tk::Star;
64 "*=" N return tk::StarEqual;
65 "~" N return tk::Tilde;
66
67 ":" N return tk::Colon;
68 "," N return tk::Comma;
69 "?" N return tk::Question;
70 ";" N return tk::SemiColon;
71
72 "(" N return tk::OpenParen;
73 ")" N return tk::CloseParen;
74
75 "{" N return tk::OpenBrace;
76 "}" N return tk::CloseBrace;
77
78 "[" N return tk::OpenBracket;
79 "]" N return tk::CloseBracket;
80
81 "break" N R yylval->word_ = new CYWord("break"); return tk::Break;
82 "case" N yylval->word_ = new CYWord("case"); return tk::Case;
83 "catch" N yylval->word_ = new CYWord("catch"); return tk::Catch;
84 "continue" N R yylval->word_ = new CYWord("continue"); return tk::Continue;
85 "default" N yylval->word_ = new CYWord("default"); return tk::Default;
86 "delete" N yylval->word_ = new CYWord("delete"); return tk::Delete;
87 "do" N yylval->word_ = new CYWord("do"); return tk::Do;
88 "else" N yylval->word_ = new CYWord("else"); return tk::Else;
89 "false" N yylval->false_ = new CYFalse(); return tk::False;
90 "finally" N yylval->word_ = new CYWord("finally"); return tk::Finally;
91 "for" N yylval->word_ = new CYWord("for"); return tk::For;
92 "function" N yylval->word_ = new CYWord("function"); return tk::Function;
93 "if" N yylval->word_ = new CYWord("if"); return tk::If;
94 "in" N yylval->word_ = new CYWord("in"); return tk::In;
95 "instanceof" N yylval->word_ = new CYWord("instanceof"); return tk::InstanceOf;
96 "new" N yylval->word_ = new CYWord("new"); return tk::New;
97 "null" N yylval->null_ = new CYNull(); return tk::Null;
98 "return" N R yylval->word_ = new CYWord("return"); return tk::Return;
99 "switch" N yylval->word_ = new CYWord("switch"); return tk::Switch;
100 "this" N yylval->this_ = new CYThis(); return tk::This;
101 "throw" N R yylval->word_ = new CYWord("throw"); return tk::Throw;
102 "true" N yylval->true_ = new CYTrue(); return tk::True;
103 "try" N yylval->word_ = new CYWord("try"); return tk::Try;
104 "typeof" N yylval->word_ = new CYWord("typeof"); return tk::TypeOf;
105 "var" N yylval->word_ = new CYWord("var"); return tk::Var;
106 "void" N yylval->word_ = new CYWord("void"); return tk::Void;
107 "while" N yylval->word_ = new CYWord("while"); return tk::While;
108 "with" N yylval->word_ = new CYWord("with"); return tk::With;
109
110 [a-zA-Z$_][a-zA-Z$_0-9]* yylval->identifier_ = new CYIdentifier(apr_pstrmemdup(yyextra->pool_, yytext, yyleng)); N return tk::Identifier;
111
112 (\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?){Exponent}? yylval->number_ = new CYNumber(strtod(yytext, NULL)); N return tk::NumericLiteral;
113
114 0[xX][0-9a-fA-F]+ N yylval->number_ = new CYNumber(strtoull(yytext + 2, NULL, 16)); return tk::NumericLiteral;
115
116 0[bB][0-1]+ N yylval->number_ = new CYNumber(strtoull(yytext + 2, NULL, 2)); return tk::NumericLiteral;
117
118 \"([^"\\\n]|{Escape})*\" N return tk::StringLiteral;
119 '([^'\\\n]|{Escape})*' N return tk::StringLiteral;
120
121 \n L
122 [ \t] ;
123
124 %%
125
126 void CYDriver::ScannerInit() {
127 cylex_init(&scanner_);
128 cyset_extra(this, scanner_);
129 }
130
131 void CYDriver::ScannerDestroy() {
132 cylex_destroy(scanner_);
133 }