options {
LOOKAHEAD = 1;
CHOICE_AMBIGUITY_CHECK = 2;
OTHER_AMBIGUITY_CHECK = 1;
STATIC = true;
DEBUG_PARSER = false;
DEBUG_LOOKAHEAD = false;
DEBUG_TOKEN_MANAGER = false;
ERROR_REPORTING = true;
JAVA_UNICODE_ESCAPE = false;
UNICODE_INPUT = false;
IGNORE_CASE = false;
USER_TOKEN_MANAGER = false;
USER_CHAR_STREAM = false;
BUILD_PARSER = true;
BUILD_TOKEN_MANAGER = true;
SANITY_CHECK = true;
FORCE_LA_CHECK = false;
}
PARSER_BEGIN(Simple1)
/** Simple brace matcher. */
public class Simple1 {
/** Main entry point. */
public static void main(String args[]) throws ParseException {
Simple1 parser = new Simple1(System.in);
parser.Input();
}
}
PARSER_END(Simple1)
/** Root production. */
void Input() :
{}
{
MatchedBraces() ("\n"|"\r")* <EOF>
}
/** Brace matching production. */
void MatchedBraces() :
{}
{
"{" [ MatchedBraces() ] "}"
}
认真的看了javacc中的simpleExamples中的example1.jj以及readme文档,才刚刚开始理解Javacc中的简单语法。
Following this is a list of productions. In this example, there are
two productions, that define the non-terminals "Input" and
"MatchedBraces" respectively. In JavaCC grammars, non-terminals are
written and implemented (by JavaCC) as Java methods. When the
non-terminal is used on the left-hand side of a production, it is
considered to be declared and its syntax follows the Java syntax. On
the right-hand side its use is similar to a method call in Java.
对应simple1.jj中的代码如下
void Input() :
{}
{
MatchedBraces() ("\n"|"\r")* <EOF>
}
/** Brace matching production. */
void MatchedBraces() :
{}
{
"{" [ MatchedBraces() ] "}"
简单的翻译下:
接下来是一系列的产生式。在这个例子中,有分别定义非终结符“Input”和 “MatchedBraces”两个产生式。在JavaCC语法中,非终结符的申明和实现犹如java语言中方法。当该终结符出现在产生式的左边时,则该终结符被声明,该语法和java中语法相同。如果出现在右边,类似于java中方法的调用。
Each production defines its left-hand side non-terminal followed by a
colon. This is followed by a bunch of declarations and statements
within braces (in both cases in the above example, there are no
declarations and hence this appears as "{}") which are generated as
common declarations and statements into the generated method. This is
then followed by a set of expansions also enclosed within braces.
每个产生式定义了后面紧跟着冒号的“左边”非终结符。接着是一串带有大括号的declarations和statements(在上面的两个产生式中,都没有详细的declarations,所以在代码中仅仅有“{}”),
而在statements可以是一系列的表达式或declarations或statements。
Lexical tokens (regular expressions) in a JavaCC input grammar are
either simple strings ("{", "}", "\n", and "\r" in the above example),
or a more complex regular expression. In our example above, there is
one such regular expression "<EOF>" which is matched by the end of
file. All complex regular expressions are enclosed within angular
brackets.
Javacc中词法记号(正则表达式)或者是简单的字符串或者是一些复杂的正则表达式。在这个例子中,有这样一个正则表达式“<EOF>”,它表示文件的末尾。所有复杂的正则表达式以尖括号封闭。
The first production above says that the non-terminal "Input" expands
to the non-terminal "MethodBraces" followed by zero or more line
terminators ("\n" or "\r") and then the end of file.
该例子中的第一个表达式表明了:非终结符“Input”为在非终结符MethodBraces后跟了0或多个终结符“("\n" or "\r")”以及文件的结束。
The second production above says that the non-terminal "MatchedBraces"
expands to the token "{" followed by an optional nested expansion of
"MatchedBraces" followed by the token "}". Square brackets [...]
in a JavaCC input file indicate that the ... is optional.
第二个产生式表明:非终结符“MatchedBraces”为“{”后跟着可选可不选的“MatchedBraces”后再跟着“}”,中括号[]的的内的内容是可选的。
[...] may also be written as (...)?. These two forms are equivalent.
Other structures that may appear in expansions are:
e1 | e2 | e3 | ... : A choice of e1, e2, e3, etc.
( e )+ : One or more occurrences of e
( e )* : Zero or more occurrences of e
Note that these may be nested within each other, so we can have
something like:
(( e1 | e2 )* [ e3 ] ) | e4
[…]也可以写成(…)?。这两种格式是等价的,其他一些结构:如上。
分享到:
相关推荐
在实际的"实验二"中,我们可能需要编写一个简单的文法,如表达式文法,然后使用JavaCC生成解析器。接着,我们测试这个解析器,看它是否能正确解析各种合法和非法的输入,同时处理可能出现的错误。通过这样的实践,...
《使用JavaCC进行语法分析》 JavaCC,全称为Java Compiler Compiler,是一款强大的、开源的词法分析和语法分析工具,特别适用于构建编译器、解释器或脚本引擎。它是基于LL算法的,允许开发者通过定义文法规则生成...
例如,如果你正在创建一个简单的编程语言解析器,JavaCC可以帮助你识别像"if"、"for"、"while"这样的控制结构关键词。 面对对象(Object-Oriented)是JavaCC的一个关键特性。它生成的解析器和词法分析器是用Java...
安装JavaCC Eclipse插件的过程相对简单。描述中提到的".exe安装版"通常指的是Windows平台下的可执行文件,用于在Eclipse中安装插件。安装步骤大致如下: 1. 下载.exe安装文件。 2. 打开Eclipse,选择"帮助"(Help)...
JavaCC,全称为Java Compiler Compiler,是一个开源的解析器生成器,主要用于构建语法和词法分析器,尤其在处理复杂的字符串处理任务时显得尤为重要。它根据用户提供的上下文无关语法(Context-Free Grammar, CFG)...
本文首先简要介绍了语法分析器自动生成的原理,并重点介绍了一个由Sun公司开发的编译器自动生成工具——JavaCC,以及如何利用JavaCC来构造编译器。 #### 二、编译器自动生成原理 编译器是计算机应用中最常用的工具...
此版本可能对初学者来说较为友好,因为它的API和语法相对简单。 - JavaCC-5.0:相较于4.0版本,5.0版本可能引入了更多的优化和新特性,例如改进了错误处理机制,增加了对Java 5特性的支持,如泛型。可能还增加了对...
只要做很简单的处理,就能够利用javacc的国际化特性。javacc允许四种字符输入流(互斥的,一个分析器只能使用一种输入流),它们分别是: 1. ASCII_CharStream(ASCII码字符流) 2. ASCII_UCodeESC_CharStream...
测试用例通常包含一系列简单的和复杂的C语言源代码,编译器需要正确地分析并生成对应的抽象语法树。这些测试可以帮助开发者找出编译器在处理特定输入时可能出现的问题,并进行调试和优化。 总的来说,这个项目提供...
4. **错误恢复**:JavaCC具有错误恢复机制,当遇到输入错误时,可以尝试恢复解析,而不是简单地停止,增加了程序的健壮性。 5. **抽象语法树(AST)生成**:JavaCC生成的解析器能够构造出输入语法的AST,这使得用户...
Java Compiler Compiler,简称JavaCC,是一个强大的工具,用于在Java语言环境中生成词法分析器(lexical analyzers)和语法分析器(parsers)。这个工具基于LL(k)解析技术,允许开发者定义自己的语法规则,然后自动...
JavaCC(Java Compiler Compiler)是一种强大的工具,用于生成解析器和词法分析器,它基于Java语言,并且广泛应用于解析复杂语法的系统,比如编程语言、数据库查询语言等。JavaCC利用上下文无关文法(Context-Free ...
本例中的简单计算器程序展示了如何利用JavaCC来定义语法规则并实现基本的数学运算。无论是对于想要深入了解编译器工作原理的学习者,还是希望创建自己专属语言的开发者来说,JavaCC都是一个不可或缺的工具。
这些例子可能会涵盖从简单的算术表达式到复杂的数据结构和控制流语句,帮助初学者快速掌握JavaCC的基本用法。通过动手实践这些示例,你可以更好地理解如何编写BNF语法文件,如何配置和调用JavaCC工具,以及如何处理...
JavaCC的输入文件格式简单直观,每个非终结符的产生式对应于一个Java类中的方法,便于插入代码以处理特定的语法元素。此外,输入文件还包括一系列系统参数,例如`lookahead`参数,用于指定LL(k)算法的前瞻级别。 ##...
为了更好地理解如何使用JavaCC构建编译器,我们可以设计一个简单的命令行计算器作为示例。 - **定义词法规则**:首先要定义计算器能够识别的词汇单位,如数字、加号、减号等。 - **定义文法规则**:接下来需要定义...
JavaCC(Java Compiler Compiler)是一种强大的词法分析和语法分析工具,用于生成Java源代码的解析器和词法分析器。这个实习项目旨在让你深入理解编译原理,并通过实际操作来构建一个小型编译器。在JavaCC的帮助下,...
例如,一个简单的加减乘除计算器的语法规则可能包括数字、运算符(+、-、*、/)以及括号等元素。 解压"Test.rar"后,你会找到一个包含该项目的文件夹,里面可能有以下几个关键部分: 1. **Test/src**: 这是源代码...