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