Due: Wednesday 22 February 2018
The first thing we have to do with any programming language is build a lexical analyzer that converts a text string into a series of tokens. There are lots of tools for handling this. For this assignment, you'll make use of the Flex lexical analysis tool and build a few different parsers.
Flex is an open source lexical analysis tool. The way it works is you first create an input file that defines symbols and production rules that describe how to parse a text file. Then you run Flex and it produces a C file. You can then compile the C file and run it on some input.
As an example, consider the following Hello World program
for Flex. The line beginning with blah defines a rule that
says to replace instances of blah with hello
world.
/**
* Hello World: replace "blah" with "hello world"
*/
%%
blah printf("hello world");
%%
int main ( int argc, char *argv[] ) {
yylex();
}
If you type the above into a file called replace.yy and then execute the following commands, you get the resulting behavior.
$ flex replace.yy
$ gcc -o repl lex.yy.c -ll
$ echo "blah and another blah" | ./repl
hello world and another hello world
The documentation for flex provides many more examples and a description of the syntax.
Note that flex is based on regular expressions, which are similar to the extended BNF notation we've gone over in class. There is lots of documentation for regular expressions, and they can be very useful in many situations.
Using flex, make a program called encode that takes any character in a-z or A-Z and shifts it 13 spaces forward in the alphabet, with wraparound from z back to a. Run it on a text file of your choice. You can test that it is working correctly by running the output of encode through encode again. The result should be the original document. Make use of the fact that you can get the ASCII value of any character by wrapping it in single quotes (e.g. 'a' is the value 97). You can treat it as an integer and do math.
Using Flex, make a program that reads in a text file and tells you not only the number of rows and characters, but also how many of each vowel [a, e, i, o, u] are in the file.
Make a program that strips an html file of all tags and comments.
It should also strip the file of all whitespace except for a blank line
wherever there used to be a <p> tag. Test it on this
web page. Here is a downloadable
version.
Note that this is challenging to do in a way that make the output
reasonably formatted. As an extension, you can make your program do
more sophisticated things like replace
> with >.
Implement a parser for Clite. For now, the output of your program should just be a sequence of strings, one per line. Please use the following strings.
| Integer-<value> | A sequence of one or more digits. |
| Float-<value> | An integer, a dot, and another integer. |
| Keyword-<word> | if | else | while | for | int | float |
| Identifier-<name> | Legal names/identifiers. |
| Assignment | = |
| Comparison-<symbol> | == | < | > | <= | >= |
| Operator-<symbol> | + | - | * | / |
| Open-bracket | { |
| Close-bracket | } |
| Open-paren | ( |
| Close-paren | ) |
Ideally, your program should also ignore comments. You can test your program on this example. You should get something like this result.
Select two languages you want to learn this semester. You may work with a partner for the non-C language tasks. You and your partner need to choose the same languages. You will hand in your C work separately, but have a single wiki and handin for your non-C language assignments.
Make sure there is a link to your project 1 on your top level page for the course.
Having a properly organized wiki space is worth 3 points on this project.
Extensions are a way for you to customize the assignment and learn something of interest to you. Pick a task and dig deeper. Pick a different language and learn something about it. Do something interesting. The following are possible extensions, but you can choose your own. Extensions can be undertaken individually or jointly.
The submission of this project has three components:
To check whether you've made your write-up well organized, you may ask yourself the following questions:
Here is a recommended layout.
Ying Li CS333 | |_Ying’s Explorations in R | | | |_P1 | |_P2 | |_... | |_Ying’s Notes in JS | | | |_P1 | |_P2 | |_...
Please note that it is your responsibility to explicitly indicate the extensions you have undertaken. If you complete extensions for the parsers, please indicate explicitly in the code and README file. If you complete extensions in selected languages, please indicate this explicitly in your wiki report. Because extensions can be individual or joint, you need to indicate this along with your description of the extension. If no indication is provided, the grader will assume the extensions were completed jointly.