Using JFlex
The following is a tutorial on using JFlex for the project 1 assignment in CS4413/CS5413 at Lakehead University
Step 1: Download and Setup JFlex
The first step is to download and setup jflex (assuming you have java installed and setup correctly).
The link to download it is: http://jflex.de/jflex-1.4.3.zip
Once you have the zip file downloaded unzip it into a folder where you would like to install it. This can be any folder as long as your user account has permission to run the programs in it. In my case (using linux) I have installed it to /home/dan/compilers/jflex-1.4.3.
Next you need to add the bin directory in jflex-1.4.3 to the system’s path. How to do this is different on each OS.
For windows XP:
1. Start -> Control Panel -> System -> Advanced
2. Click on Environment Variables, under System Variables, find PATH, and click on it.
3. In the Variable Value text box add ;my_path_to_jflex\jflex-1.4.3\bin\ to the end where “my_path_to_jflex” is your path to the jflex folder you installed. For example if you installed jflex to C:\Users\Dan\jflex-1.4.3 the text that you would add to the path would be ;C:\Users\Dan\jflex-1.4.3\bin\ make sure to not to delete the contents of the text box and only add to them.
4. Click OK -> OK -> OK untill you are back to the desktop.
See http://support.microsoft.com/kb/310519 for more information on system variables in xp.
For windows Vista and 7:
1. Click on the start menu and type “edit the system environment variables” into the search box in till you see the control panel short cut come up.
2. Click “edit the system environment variables” and then click Environment Variables on the window that pops up.
3. From the System variables list find Path and double click on it.
4. In the Variable Value text box add ;my_path_to_jflex\jflex-1.4.3\bin\ to the end where “my_path_to_jflex” is your path to the jflex folder you installed. For example if you installed jflex to C:\Users\Dan\jflex-1.4.3 the text that you would add to the path would be ;C:\Users\Dan\jflex-1.4.3\bin\ make sure to not to delete the contents of the text box and only add to them.
5. Click OK -> OK -> OK untill you are back to the desktop.
For Linux/Unix using the bash shell:
1. Open ~/.bashrc in your favorite editor (ex. nano ~/.bashrc).
2. At the end of the file add:
PATH=$PATH:your_path_to_jflex/jflex-1.4.3/bin
export PATH
Where your_path_to_jflex is your path to the folder where you installed jflex. For example my PATH line is PATH=$PATH:/home/dan/compilers/jflex-1.4.3/bin
3. Save the file.
Once you have updated the path on your system you may need to logout and back in or restart your shell before the changes take effect.
Windows users will also have to edit the jflex.bat file in jflex-1.4.3/bin and set JFLEX_HOME in the file to their correct value.
JFLEX_HOME should point to the directory where jflex is installed. For example if jflex was installed to C:\Users\Dan\jflex-1.4.3\ the line should be: set JFLEX_HOME = C:\Users\Dan\jflex-1.4.3\
Next the lines following the “only needed for JDK 1.1.x” and “for JDK 1.1.x” comments should be removed or commented out. And finally the “rem” on the last line should be removed. The file should look something like this:
@echo off REM Please adjust the paths JFLEX_HOME and JAVA_HOME to suit your needs REM (please do not add a trailing backslash) set JFLEX_HOME=C:UsersDanjflex-1.4.3 REM ------------------------------------------------------------------- set CLPATH=%JAVA_HOME%libclasses.zip;%JFLEX_HOME%libJFlex.jar REM for JDK 1.2 java -Xmx128m -jar %JFLEX_HOME%libJFlex.jar %1 %2 %3 %4 %5 %6 %7 %8 %9
Linux users may want to take a look at the jflex-1.4.3/bin/jflex script however, it should be fine by default.
Step 2: Using JFlex
Jflex can be used via it’s GUI or via the command line. To use the GUI simply type jflex on the command line/shell and the GUI should run. To pass an input file to jflex via the command line simply type jflex input_file where input_file is the name of the lexical specification file (in our case lexer.flex).
GUI
1. Click the browse button for the Lexical specification field and select your Lexical Specification file (lexer.flex).
2. If you want to output the java class in a different directory then listed in the output directory filed, click the browse button by the output field and select the new output directory.
3. Click generate.
4. Look at the Messages text box. If there are warnings or errors there is likely something wrong with the contents of your lexer.flex file, go through it and fix any errors and try to generate it again. If there are no errors or warnings your lexical analyzer should be created in the output directory as a .java file (in our case Lexer.java).
Command Line
1. Use the command line or shell to navigate to the directory with your lexical specification (lexer.flex).
2. Type in jflex input_file where input_file is the name of your specification (lexer.flex).
3. If there are warnings or errors there is likely something wrong with the contents of your lexer.flex file, go through it and fix any errors and try to generate it again.
4. If there were no errors or warnings your lexical analyzer should now be output in the same folder as a .java file (in our case Lexer.java).
For more details on install and running jflex see http://jflex.de/installing.html
Step 3: Using the Lexical Analyzer
For this assignment a Driver.java and Token.java file were given to you that contain the code to use the lexical analyzer generated as Lexer.java. To use them on the C– code provided you must first compile the java code using javac. Since Driver, Token and Lexer are all in the same package they must be in the same directory named lexer. To compile the code simple issue the following commands in your shell/command line:
javac Token.java
javac Lexer.java
javac Driver.java
If there was an error comping the Lexer.java file, there likely was a problem with your lexical specification.
If all the code complied with no errors or warnings you should be able to run the Driver program on some C– code by issuing the fallowing command:
java Driver cmm_file
Where cmm_file is the text file contain the C– code. For example if the code file is test.cmm the line should be java Driver test.cmm.
Ideally there should be not errors and the output should match the example output given (assuming you used the example input in test.cmm).
Assignment Tips
- Make sure all your class files are in the same folder named lexer and that this folder is in the java class path.
- There should be no need to make any changes to any of the .java files. All the work should be done in the lexer.flex file.
- Take a look at the contents of the Token.java file, the tokens that are returned by nextToken in the scanner should be of this type.
- Make sure to test your scanner on the given sample input/output.
- You can find the jflex documentation here: http://jflex.de/manual.html which will help you in creating the lexer.flex specification.
- http://www.cs.auckland.ac.nz/~bruce-h/lectures/330ChaptersPDF/ is also a good resource for using JFlex and CUP.
March 16th, 2010 at 12:24 am
[…] and Setup It is assumed that you have java and jflex (see http://hackerdan.com/programing/using-jflex/) installed and […]
January 5th, 2012 at 1:27 pm
Hey thanks for writing this, I was wondering though if you could send me those .java files, i’m trying to understand Jflex but its been so far quite difficult to get any example on how use it, I have to do a kind of Interpreter for an assingment at the Uni and have really no Idea where I should start at, I would really appreciate it if you would send me something I can start with.
Andrés Portillo
February 14th, 2012 at 4:53 am
nice link of resource for using Jflex & cup, thaks!
March 7th, 2012 at 11:33 am
Hey,
I had a doubt with jflex.
I am trying to develop a scanner for java, using jflex. The scanner is working fine. But the problem is when I see comments jflex does not leave as many lines as the comment took, instead it leaves just a single line on seeing a comment. But I need jflex to see the comments and leave as many lines as the comments took. The code I used to identify comments is -
LineTerminator = \r|\n|\r\n
Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment}
TraditionalComment = “/*” [^*] ~”*/” | “/*” “*”+ “/”
EndOfLineComment = “//” {InputCharacter}* {LineTerminator}
DocumentationComment = “/**” {CommentContent} “*”+ “/”
CommentContent = ( [^*] | \*+ [^/*] )*
and then when i see a white space I just ignore it.
{Comment} { /*Ignore */ }
But then the output is not like what I expect for eg - If i give the input
int main()
{
/*
*
* Have a pleasant day
*
*
*/
}
I get the output
int main()
{
}
I dont get the 6 lines in between. Thanks