`
RednaxelaFX
  • 浏览: 3053469 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

MiniJava的语法

 
阅读更多
MiniJava语言参考。引用自Modern Compiler Implementation in Java, Second Edition,Appendix A, Page 484-486。

下面是MiniJava语法的EBNF。粗体蓝色的表示terminals,斜体的是non-terminals。星号(*)表示出现0或多次。
引用
ProgramMainClass ClassDecl*
MainClassclass id { public static void main(String[ ] id) { Statement* } }
ClassDeclclass id { VarDecl* MethodDecl* }
_________class id extends id { VarDecl* MethodDecl* }
VarDeclType id ;
MethodDeclpublic Type id ( FormalList ) { VarDecl* Statement* return Exp; }
FormalListType id FormalRest*
_________
FormalRest, Type id
Typeint[]
____boolean
____int
____id
Statement{ Statement* }
_________if ( Exp ) Statement else Statement
_________while ( Exp ) Statement
_________System.out.println(Exp);
_________id = Exp;
_________id[Exp] = Exp;
ExpExp op Exp
___Exp [Exp]
___Exp .length
___Exp . id (ExpList)
___INTEGER_LITERAL
___true
___false
___id
___this
___new int[Exp]
___new id( )
___!Exp
___(Exp)
ExpListExp ExpRest*
_______
ExpRest, Exp

(注释:op表示二元运算符,可以是: && < + - *的任意一个;
.length只能作用于int[]类型的变量上。)

本来是想找找比较简单的实例,看看别人是如何实现类(class)的作用域的。然而这MiniJava真作 弊,居然强制要求变量声明在方法声明之前,于是我遇到的问题在一定程度上给避开了。Hmm……我再想想看怎么办好……
分享到:
评论
4 楼 RednaxelaFX 2008-04-28  
dohkoos 写道
class-scope和这个词法、语法分析没有什么关系吧!应该是句法阶段才处理的

嗯,scoping是语义分析的部分而不是词法或语法分析的部分。不过syntax-directed translation的方式会在grammar中嵌入语义相关的action,这里会使语法文件牵扯到一点语义的处理问题。

例如说
stmt : block
     | assignStmt
     ;

block : '{' 
        stmt*
        '}'
      ;

很可能会在看到'{'之后去嵌入{ $env = $env.push(new Environment($env)); }之类的,然后在看到'}'的时候pop掉那个scope。
或者即便是先生成AST,然后用tree walker去做语义分析,也可以在tree grammar里嵌入这些action。所以想看看别人是怎么做(嵌入的action)的。并不是跟语法有直接的关系咯。

我说MiniJava偷懒主要是限制了成员变量声明要在方法声明之前,而方法体里的语句也要在局部变量声明之后;这样使得对成员变量的访问问题比较容易解决,而方法对别的方法的引用则没有解决(仍然可以引用在自己之后出现的方法)。
3 楼 dohkoos 2008-04-27  
class-scope和这个词法、语法分析没有什么关系吧!应该是句法阶段才处理的

http://www.dohkoos.name
2 楼 RednaxelaFX 2008-04-23  
lwwin 写道
OP .... 就是说没有二元操作符优先顺序了……

不是,这个是可以设置的。看具体的解析器生成器的规格,或者自己手写解析器的话更容易控制。
yacc-like的解析器生成器都可以指定运算符的优先级……这个不是问题。

我遇到的问题是class-scope的问题。一般的scope都是declare before use,但class-scope却意味着class内的declaration在整个class-scope内都有效(即使在代码上声明在使用的后面也没关系),这问题挺麻烦的,我想看看别人是怎么实现的。不然按我偷懒的办法这效率就……T T
1 楼 lwwin 2008-04-23  
OP .... 就是说没有二元操作符优先顺序了……

相关推荐

    src.rar_minijava_minijava-sample

    1. **MiniJavaParser.java**:这是MiniJava语法解析器的实现,基于词法分析器生成的语法树。它将源代码的字符流转换为抽象语法树(AST),这个过程通常由解析器完成。在MiniJava项目中,这个解析器解析MiniJava源...

    miniJava编译器

    在MiniJava编译器的情况下,它的主要任务是将符合MiniJava语法规则的程序转换为可执行的代码。这个过程通常分为词法分析、语法分析、语义分析和代码生成四个阶段。 1. **词法分析**:此阶段,编译器将源代码分解为...

    MiniJava编译器

    MiniJava的语法规则相对简单,易于实现。 - **语义分析**:检查程序的语义是否正确,如类型检查、变量声明等,并生成中间代码或直接目标代码。 - **代码生成**:将中间代码转换为特定平台的目标代码,如x86汇编或...

    miniJava-pa2:COMP 520 的 PA2 - 编译器

    COMP 520:编译器PA2 - 抽象语法树编译器项目的第二个里程碑是为任何根据我们的 miniJava 语法在句法上有效的 miniJava 程序创建抽象语法树 (AST)。 此作业要求您结合 Java 运算符优先级规则,并使用本文档中概述的...

    基于MINIJAVA转MIPS的编译器

    2. 语法分析:接着,语法分析器(Parser)会根据预定义的文法规则,检查标记序列是否符合MINIJAVA的语法规则,生成抽象语法树(AST)。AST直观地反映了程序的结构,为后续的语义分析提供便利。 3. 语义分析:在这一...

    MiniJava:用 Java 编写的 MiniJava 编译器

    第 1 部分:MiniJava 类型检查器 程序 准备 JavaCC 和 JTB 将minijava.jj给 JTB,JTB 将生成jtb.out.jj 将jtb.out.jj给 JavaCC,JavaCC 会产生一些 java 文件,唯一有用的 Java 文件是MiniJavaParser.java 创建主...

    Minijava-Compiler:minijava语言变体的编译器

    Minijava是一种简化版的Java,保留了其核心语法特性,但去除了部分复杂特性,便于教学和理解。 一、Minijava语言简介 Minijava是Java语言的一个简化版本,主要用于教学目的。它保留了Java的主要结构,如类定义、...

    MiniJavaCompiler:这是将 MiniJava 编译为 MIPS 的 MiniJava 编译器

    MiniJava是一种教学用的编程语言,它保留了Java的核心语法特性,如类、方法、变量声明和控制流结构,但去除了高级特性,如多线程、异常处理和泛型等。MiniJava的设计目的是为了便于分析、理解和实现编译器。它的编译...

    MiniJava-Compiler:专为课程设计的Mini Java编译器

    2. **语法分析**:接下来,编译器根据MiniJava的语法规则检查标记流,构建抽象语法树(AST)。这个过程通常由递归下降解析器完成,它确保输入代码符合语言的句法结构。 3. **语义分析**:在语义分析阶段,编译器...

    使用Javacc生成MiniJava编译器的.jj文件

    实现的是一个MiniJava的扩展语言, 1)添加了double类型,及其数组。 2)实现了do while语句 3)使用嵌入java代码的方式实现了自行构造语法树,节点类ANode请自行实现 ANode类很简单,如果不要实现其它功能,直接用...

    minijavacompiler:MiniJava的编译器,它是Java编程语言的子集

    总而言之,minijavacompiler是学习编译原理和Java编程语言的一个宝贵资源,通过实践它可以加深对编程语言理论、编译技术以及Java语法的理解。无论是作为教学工具还是研究项目,minijavacompiler都提供了一个实际操作...

    miniJava-pa1:COMP 520 的 PA1 - 编译器

    第一个任务是为 miniJava 构建一个扫描器和解析器,以识别语法正确的程序。 迷你Java miniJava 语言是 Java 的一个子集。 每个 miniJava 程序都是具有 Java 语义的合法 Java 程序。 以下是对定义 miniJava 的 Java...

    贪吃蛇的java简单源码-MiniJava-Compiler:编译器可以将MiniJava语言翻译成x86汇编语言,可以进一步编译成可执行文件

    贪吃蛇的java简单源码MiniJava 编译器 MiniJava 是一种帮助学生理解编译器理论的教学语言。 MiniJava 的介绍可以在教科书中找到。 在项目中,MiniJava编译器是用Java编写的。 与其他 MiniJava 项目不同,这是一个...

    jquery (mini java)

    - **易学易用**:语法简洁,学习曲线平缓,让开发者能快速上手。 - **提高效率**:通过jQuery,开发者可以减少编写代码的数量,同时增强代码可读性和维护性。 ### miniUI Java与jQuery 提到“miniui_java”,这...

    MiniJava:使用JFlex,Beaver和JastAdd的MiniJava MIPS编译器

    适用于MiniJava的MIPS编译器 设置 构建:使用ant运行 。 测试:使用junit运行套件。 (可选)在Eclipse中突出显示JastAdd语法: 。 然后在“首选项”下的“文件” -&gt; “编辑器” -&gt; “文件关联”下,将“ * ....

    sutech-compiler-1400:设拉子科技大学编译器设计课程项目的主要存储库

    这是一个示例 MiniJava 语法(BNF 表示法),可用于编译器的解析器。 注意:此语法只是一个示例。 您可以在项目的第一阶段根据您的设计将其更改为您的需要。 Goal :: = MainClass ( ClassDeclaration ) * Main...

    minijava-parser:在ANTLR的帮助下进行AST构造

    用于生成源代码的antlr语法位于src / main / antlr4 / minijava.g4中。AST由类ASTGenerator构建,该类继承自minijavaBaseListener。 它的源文件是src / main / java / minijava / ASTGenerator.java 符号表由...

    miniJava:编译器实践课程项目

    在这个过程中,你将需要用到一些工具和理论,比如正则表达式用于词法分析,上下文无关文法(Context-Free Grammar, CFG)描述MiniJava的语法,以及类型系统和作用域规则来实现语义分析。 在实际开发时,你可能会...

    minijava:本书现代编译器实现的java实现

    它是一种简化的Java语法,去除了许多高级特性,如异常处理、多线程、反射等,以使编译器的实现更为简洁。这个简化版的语言保留了基本的类结构、方法定义、变量声明、运算符以及控制流语句,使得初学者能够专注于...

    javacc+jjtree使用教程

    - 当运行`jjtree minijava.jjt`时,JJTree会生成一系列的Java源文件,包括一个新的`.jj`文件(在这个例子中是`minijava.jj`),这个文件包含了JJTree处理后的语法规则,以及表示AST节点的类。 3. **生成的Java文件...

Global site tag (gtag.js) - Google Analytics