• [编译原理]词法分析器JLEX使用指南 (Jdk1.5.0 + JLex 1.2.6)


    作者:ANNEROSE  环境:Jdk1.5.0 + JLex 1.2.6 日期:2007-01-07

    Jlex工具基于Lex词法分析生成器,它接受类似Lex文件格式的文件,生成Java源代码格式的词法分析器。

    (本项目用命令行编译,不使用Eclipse) 
     
    1. 开发环境jdk1.5.0配置
      
      第一步:下载j2sdk:到sun官方站(
    http://java.sun.com/j2se/1.5.0/download.jsp)下载j2sdk,注意下载版本为Windows Offline Installation的SDK,同时最好下载J2SE 1.5.0 Documentation;
      
      第二步:安装和配置你的j2sdk执行j2sdk的安装程序,然后按默认设置进行安装即可。
      
      第三步:安装j2sdk以后,需要配置一下环境变量,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的j2sdk安装在C:\Program Files\Java\jdk1.5.0)

      
      JAVA_HOME=C:\Program Files\Java\jdk1.5.0
      classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因为它代表当前路径)
      path=%JAVA_HOME%\bin
      
      接着可以写一个简单的java程序来测试jdk1.5.0是否已安装成功:
      
         public class HelloJava {
            public static void main(String _args[]) {
                System.out.println("Hello, Java!");
            }
        }
      
      将上面的这段程序保存为文件名为HelloJava.java的文件。
      
      然后打开命令提示符窗口,cd到你的HelloJava.java所在目录,然后键入下面的命令
      
      javac HelloJava.java
      java HelloJava
    (注意HelloJava的大小写!!!)
      
      此时如果看到打印出来Hello, Java! 的话说明安装成功了,如果没有打印出这句话,你需要仔细检查一下你的配置情况。


    2. 下载JLEX 1.2.6 就是那个200K的Main.java文件

    http://www.cs.princeton.edu/~appel/modern/java/JLex/

    3. 以下步骤参照JLex的README

    (1) Choose some directory that is on your CLASSPATH, where  you install Java utilities such as JLex.  I will refer to this directory as "J", for example.
    于是建立文件夹 "E:\J\JLex", 把"E:\J" 写入环境变量CLASSPATH

    (2) Make a directory "J/JLex" and put the sourcefile Main.java in J/JLex.
    把下载的文件Main.java 拷入 J/JLex.

    (3) Compile Main.java as you would any Java source file: javac Main.java
    This should produce a number of Java class files, including Main.class, in the "J/JLex" directory, where "J" is in your CLASSPATH.

    进入E:\J\JLex为当前目录(不作也可以,因为之前设了环境变量)。运行 javac Main.java 可以得到很多class文件,包括Main.class
    命令行有2行注意
    Note: Main.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.

    反正class文件已经生成。不管它。

    (4) To run JLex with a JLex specification file, the usage is:
     java JLex.Main <filename>

    运行java JLex.Main sample.lex,得到词法分析器代码sample.lex.java。lex文件怎么写,本文不作论述。可以从JLex下一个sample.lex试一下。


    (5) The resulting lexical analyzer source file should be compiled with the Java compiler:
     javac <filename>
    where <filename> is the name of the lexical analyzer

    运行 javac sample.lex.java 不能通过,有7 errors。

    sample.lex.java:11: as of release 1.4, 'assert' is a keyword, and may not be used as an identifier
    (try -source 1.3 or lower to use 'assert' as an identifier)
      public static void assert
    ...

    再运行 javac  -source 1.3 sample.lex.java,有7 warnings。生成Sample.class, Utility.class, Yylex.class, Yytoken.class

    sample.lex.java:11: warning: as of release 1.4, 'assert' is a keyword, and may not be used as an identifier
    (try -source 1.4 or higher to use 'assert' as a keyword)
      public static void assert
    ...

    上面两则警告和出错信息自相矛盾,真是岂有此理。不过既然编译通过,就不管了。我们继续:)

     注: javac -source <release>          Provide source compatibility with specified release

    (6) Run the generated lexer with:
      java Sample
    which expects input on stdin.  The lexer parses tokens that resemble those for a typical programming language; whitespace is generally ignored.  Java
    buffers input from stdin a line at a time, so you won't see any output until you type enter.

    运行该词法分析器 java Sample(注意大小写!!!)。输入一行就显示分析结果。

    输入{ /* comment */ a := b & c; }
    显示

    Token #7: { (line 0)
    Token #43: a (line 0)
    Token #22: := (line 0)
    Token #43: b (line 0)
    Token #20: & (line 0)
    Token #43: c (line 0)
    Token #2: ; (line 0)
    Token #8: } (line 0)
    Exception in thread "main" java.lang.Error: Lexical Error: Unmatched Input.
            at Yylex.yylex(sample.lex.java:374)
            at Sample.main(sample.lex.java:6)

     以上是我学习使用JLEX的一点心得,欢迎各位高手指正。

     

  • 相关阅读:
    commonJS — 数组操作(for Array)
    seafile增加邮件服务功能
    2.事务和系统概念
    1.事务处理简介
    glusterfs分布式复制扩容卷以及平衡卷
    seafile数据的备份与恢复
    seafile+glusterfs 安装部署
    虚拟机或物理服务器热添加硬盘
    bash: cannot create temp file for here-document: Read-only file system
    FATAL ERROR: please install the following Perl modules before executing ./mysql_install_db: Data::Dumper
  • 原文地址:https://www.cnblogs.com/astate/p/614341.html
Copyright © 2020-2023  润新知