Skip to content

A demo project showing the use of yacc and lex (bison, flex) in a Xcode project

Notifications You must be signed in to change notification settings

epatel/ParserTest

Repository files navigation

Parser Test with Xcode

Xcode can handle bison and flex definition files. Xcode can even compile the generated files as Objective-C making it easier to bridge a parser into Objective-C. Pretty nice I think.

This demo shows a simple calculator. tokenizer.lm contain the parts for divinding the character stream into parts for the parser which is in the parser.ym file. The added m on the extension is that detail that makes Xcode compile the generated files as Objective-C files.

To make it a little bit more interesting I added identifiers that is dynamically handled between the tokenizer and parser. In the tokenizer you can see that it will be set as a retained string. The parser only knows about pi at the moment and everything else will have the value 0.0

There are two possible places for a identifier string to be released, either in the last part of this rule

number : INTEGER { $$ = $1; }
| FLOAT { $$ = $1; }
| IDENTIFIER { if ([$1 isEqualToString:@"pi"]) $$ = M_PI; else $$ = 0.0; [$1 release]; }

or the defined destructor

%destructor { [$$ release]; } IDENTIFIER 

The defined destructor is used if the parser need to clean up some intermediate handling, by error or not.

One caveat I stumbled upon was that I couldn't get "[[" to work in the tokenizer, which seem to use that for some internal marker. So instead I use "[ [" which may look strange. The line in the tokenizer is this

[a-zA-Z]+ { yylval.identifier = [ [NSString stringWithFormat:@"%s", yytext] retain]; return IDENTIFIER; }

Now I wish I had a task to solve with my own language...

About

A demo project showing the use of yacc and lex (bison, flex) in a Xcode project

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published