- javacc的语法描述性文件以.jj结尾,一般情况下采用
- 1、option{JavaCC的选项}
- options部分,用于放置 JavaCC 的选项,常见option包括:
- STATIC:用于决定JavaCC生成的所有成员及方法是否被定义为static(注意:定义为static后,JavaCC所生成的解析器无法再多线程环境下使用)值为 true,表示定义为 static;值为 false,表示不定义为 static该选项的默认值为 true。STATIC = false;(以英文分号结尾)
- UNICODE_INPUT:用于决定是否支持处理带有中文的字符串。;值为 true,表示支持中文处理;值为 false,表示只支持 ASCII 码;该选项的默认值为 false。UNICODE_INPUT = true;
- LOOKAHEAD:设置语法分析器的向前看符号数。通过设置此选项,可以控制语法分析器预测下一个输入的符号时需要向前查看多少个符号。默认值为1。
- UNICODE_INPUT:指定是否将输入文件作为Unicode字符流进行处理。如果设置为true,JavaCC会将输入文件视为Unicode字符流进行处理,否则按照ASCII字符流处理。默认为false。
- IGNORE_CASE: 是一个选项(option),用于指定词法分析器是否忽略输入文本中的大小写。当将 IGNORE_CASE 设置为 true 时,词法分析器会将输入的文本都转换为小写或大写字母进行匹配,从而忽略大小写的差异。
- 另外,options 也可以在执行 JavaCC 时指定。如下:$ javacc -DEBUG_PARSER=false sample.jj。需要注意的是, 如果同一个 option 既在语法描述文件中指定了,也在执行 JavaCC 时指定了,并且这两处所指定的值不同,那么 JavaCC 会选择后者所指定的的值。
- options部分,用于放置 JavaCC 的选项,常见option包括:
- 2、PARSER_BEGIN(解析器类名)package 包名import 库名。PARSER_BEGIN、PARSER_END部分不能省略,并且只能有一个。
- PARSER_BEGIN和PARSER_END是JavaCC中用于定义语法分析器类的标识符。它们的作用如下:PARSER_BEGIN:这个标识符用于指示语法分析器类的开始。在PARSER_BEGIN之后,你可以定义语法分析器类的名称、继承关系、成员变量以及其他特定于语法分析器的行为。通常,你可以在这里添加一些导入语句、声明成员变量、编写构造函数等。 2. PARSER_END:这个标识符用于指示语法分析器类的结束。在PARSER_END之前,你可以定义语法规则和语法规则之间的辅助代码,包括产生式、非终结符、终结符、语义动作等。//例如:------
- PARSER_BEGIN(Parser)
- package parser001;
- import java.io.FileReader;
- import java.io.FileNotFoundException;
- public class Parser
- {
- public static void main(String args []) throws ParseException
- {
- try
- {
- FileReader Fr = new FileReader("t001-1.txt");
- Parser parser = new Parser(Fr);
- parser.Program();
- System.out.println("Parse Success!");
- }
- catch (Exception e)
- {
- System.out.println(e.toString());
- }
- }
- }
- PARSER_END(Parser)
- PARSER_BEGIN和PARSER_END是JavaCC中用于定义语法分析器类的标识符。它们的作用如下:PARSER_BEGIN:这个标识符用于指示语法分析器类的开始。在PARSER_BEGIN之后,你可以定义语法分析器类的名称、继承关系、成员变量以及其他特定于语法分析器的行为。通常,你可以在这里添加一些导入语句、声明成员变量、编写构造函数等。 2. PARSER_END:这个标识符用于指示语法分析器类的结束。在PARSER_END之前,你可以定义语法规则和语法规则之间的辅助代码,包括产生式、非终结符、终结符、语义动作等。//例如:------
- 3、public class 解析器类名 {任意的 Java 代码}
- 4、PARSER_END(解析器类名)。将扫描器的描述部分放到PARSER_BEGIN前面时,JavaCC 会报错。
- 5、扫描器的描述
- 6、解析器的描述
- SKIP和TOKEN的作用和用法
- 1、SKIP:SKIP 关键字用于指定需要被忽略的文本。当词法分析器遇到与 SKIP 规则匹配的文本时,它将忽略该文本,不会生成对应的 token。通常用于跳过空白字符、注释等对语法分析没有实质影响的文本。
- <DEFAULT> SKIP : { " " | "\t" | "\r" | "\n"},<DEFAULT> 是一个特殊的标记,表示默认的词法状态。SKIP 后的规则指定了要跳过的空白字符,包括空格、制表符、回车和换行符。
- 2、TOKEN:TOKEN 关键字用于定义词法分析器中的 token。它指定了一种模式,当词法分析器匹配到满足该模式的文本时,将生成对应的 token。
- TOKEN : { < IDENTIFIER: (["a"-"z","A"-"Z"])+ >}IDENTIFIER 是一个 token 名称,用于在语法分析器中引用识别出的标识符。模式 (["a"-"z","A"-"Z"])+ 匹配一个或多个字母字符,表示标识符由一个或多个字母组成。
- 1、SKIP:SKIP 关键字用于指定需要被忽略的文本。当词法分析器遇到与 SKIP 规则匹配的文本时,它将忽略该文本,不会生成对应的 token。通常用于跳过空白字符、注释等对语法分析没有实质影响的文本。
- 1、option{JavaCC的选项}
- javacc --.jj将.jj文件转化成java文件
- javac *.java编译java文件
- java -- <input.txt
- 第一关:javacc命令
- 查看是否安装javacc
- javacc -version
- 如果没有安装,请安装
- apt-get install javacc
- 通过命令行进入到workspace文件夹
- cd /home/headless/Desktop/workspace/myshixun/miniCC-c1/step01
- 创建一个最简单的.jj文件,不会用vim编辑器的可以用vscode上编辑
- vim Parser.jj
- 将Parser.jj文件编译生成Java解析器和词法分析器的源代码。在使用 JavaCC 生成 Java 解析器和词法分析器的过程中,通常会生成多个 Java 文件。
- 分别代表
- Hello.java 主要的语法解析程序。
- HelloConstants.java 常量定义,jj文件定义的TOKEN在这里以常量形式定义
- HelloTokenManager.java 词法解析器
- ParseException.java 解析异常类
- SimpleCharStream 字符流,用于处理ASCII字符
- Token Token token; 在jj文件语法定义变量时用的就是此类对象
- TokenMgrError 词法错误类
- javacc Parser.jj
- 分别代表
- 使用 "javac" 命令编译生成的Java源代码
- javac Parser.java
- 如果编译成功,会生成对应的.class文件
- 然后就可以使用 java 命令运行生成的解析器了:
- java Parser
- 第二关:介绍javacc的语法规则和测试
- 首先要想正确的编译运行程序,需要设置编译路径和依赖关系
- 在终端或命令提示符中,进入到项目的根目录。
- /home/headless/Desktop/workspace/myshixun/miniCC-c1/step2
- 用javacc对.jj文件进行编译,并设置编译的输出路径要让生成的文件在 src/parser001 目录中,你可以使用 -OUTPUT_DIRECTORY 选项来指定输出目录
- javacc -OUTPUT_DIRECTORY=src/parser001 src/parser001/Parser.jj
- javacc -OUTPUT_DIRECTORY=src/parser002 src/parser002/Parser.jj
- 设置源文件的位置和输出文件的位置,在命令行中使用 -sourcepath 参数来指定源文件的位置,设置输出文件位置:使用 -d 参数来指定编译输出的目录,使用 -classpath 参数来指定类路径
- javac -sourcepath src -d bin src/parser001/Parser.java
- 最后运行程序,这将在 bin 目录中查找 parser001 包下的 Parser类,并执行它的主方法。通过这个命令,你可以运行 Parser 类并测试它的功能。
- java -cp bin parser001.Parser
- javacc中的一些语法记号:
- []:其中的内容是可选的
- +:前面的内容出现一次或多次
- *:前面的内容出现零次或次
- ?:前面的内容出现一次或零次
- |:前面或后面的内容
- ():改变运算符优先级,把括号内的内容视作一个整体
- 第三关:了解TOKEN的用法
- cd /home/headless/Desktop/workspace/myshixun/miniCC-c1
- cd src/parser002
- vim Parser.jj
- 查看是否安装javacc
- javacc -version
- 如果没有安装,请安装
- apt-get install javacc
- cd /home/headless/Desktop/workspace/myshixun/miniCC-c1
- javacc -OUTPUT_DIRECTORY=src/parser012 src/parser008/Parser.jj
- javac -sourcepath src -d bin src/parser008/Parser.java
- java -cp bin parser008.Parser
- javacc -OUTPUT_DIRECTORY=src/csapp src/csapp/Parser.jj
- javac -sourcepath src -d bin src/csapp/Parser.java
- java -cp bin csapp.Parser