Before going further with discussing how to add runtime scripting support to a Flash applications, I’d like to share with you the source code of a porting of Yacc I did a while ago. I did some simple modification to make Yacc able to go here generate ActionScript 3.0 source code instead of C. It works quite well and supports a lot standard Yacc features. There might be some issues – report them to me and I’ll try to fix them π
You can easilly find documentation about Yacc searching Google (you can start here for example).
Usually Yacc is used in conjunction with a follow url Scanner generator (like Lex/Flex), but I didn’t to any porting of commonly used Scanner generators yet.
Here you can download the sources. The source code should be portable and compilable on all the most common platform, but I didn’t tested it on Windows yet. To compile the source code on Mac or Linux, cd to the source code directory and type use:
gcc *.c -o AsYacc
Once you have the compiled binary file, you can run the Parser generator using:
./AsYacc -Hpackage=it.sephiroth.test grammar.y
Where grammar.y is a text file that contains the grammar of a language defined using the proper syntax (see the docs online for all the detailed information you may need).
Here you can download a simple calculator example that uses the RegexLexer described previously to implement the Scanner. For the ones who might be interested, here is the grammar used:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /* Infix notation calculator. */ %{ %} %token NUM %left '-' '+' %left '*' '/' %left NEG %right '^' /* exponentiation */ %% input: exp { trace( $1 ); } ; exp: NUM { $$ = $1; } | exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | '-' exp %prec NEG { $$ = -$2; } | exp '^' exp { $$ = Math.pow( $1, $3 ); } | '(' exp ')' { $$ = $2; } ; %% |