`
RednaxelaFX
  • 浏览: 3019259 次
  • 性别: 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 .... 就是说没有二元操作符优先顺序了……

相关推荐

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

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

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

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

    MiniJava:用 Java 编写的 MiniJava 编译器

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

    MiniJava编译器

    编译原理课程PJ。

    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 项目不同,这是一个...

    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 符号表由...

    编译原理中用javacc实现MiniC的词法分析、语法分析、语义分析

    用Javacc实现MiniC的词法分析、语法分析、语义分析。在词法分析部分根据单词的构词规则分类,输出&lt;单词种别,单词自身值&gt;二元式;在语法分析部分利用Javacc实现LL(1)文法,判断源语言是否符合MiniC的语法,如果不...

    mjavac:BTH的DV1585课程的MiniJava编译器

    |mjavacMiniJava的解析器和编译器,带有扩展快速开始这个项目包含的模块一起构成了mjavac-一个MiniJava编译器(带有扩展名)。 每个部分都是独立的并且可重复使用。 例如,解析器可以用作构建语法突出显示器,解释器...

    miniJavaCompiler

    以下是对定义 miniJava 的 Java 语法限制的非正式总结。 以后的分配将修改限制。 miniJava 程序是没有包声明的单个文件(因此对应于未命名或匿名的包),并且没有导入。 它由 Java 类组成。 课程很简单; 没有接口...

    javacc+jjtree使用教程

    minijava编译器的核心工具,javacc+jjtree使用教程,帮助进行词法分析、语法分析、建立抽象语法树

    assignments:每周实际作业

    MiniJava编辑器(语法分析,漂亮的打印,代码模板,语法突出显示,大纲视图) MiniJava分析器(名称分析,类型分析,约束检查,代码完成) MiniJava编译器(Java字节码生成) 所有作业均可在GitHub上公开获得: ...

    mini_C_compiler:使用lexer(使用ANTLR4解析器生成器),语法语义分析器的C语言的编译器

    安装Java的: 您可以参考安装指南。 要检查是否已安装Java: $ java -version$ javac -versionAntlr: 请访问主网站。您可以找到如何在Linux,OS X,Windows上安装。 PS:确保在源文件中放入以下行(.bashrc,.zshrc...

    Java编程艺术 PDF

    2.7 递归下降解析器中的语法检查 34 2.8 计算器Applet 34 2.9 一些尝试 37 第3章 使用Java实现语言解释器 38 3.1 解释何种计算机语言 39 3.2 解释器概述 40 3.3 Small BASIC解释器 41 3.4 Small BASIC表达式解析器 ...

    java 编程艺术

    2.7 递归下降解析器中的语法检查 34 2.8 计算器Applet 34 2.9 一些尝试 37 第3章 使用Java实现语言解释器 38 3.1 解释何种计算机语言 39 3.2 解释器概述 40 3.3 Small BASIC解释器 41 3.4 Small BASIC表达式...

    BIT-MiniCC:编译原理课程实践(BIT Mini C编译器)参考https

    参考老师提供的框架(Java实现),实现完整的语言规范的子集(C ++实现)。 1个待办事项清单 预先 词法分析 语法分析 语义分析 中间代码生成 代码优化 代码生成 2实现思路 2.1词法分析 对应代码: 目前能正确识别...

    Notepad2

    编程的朋友们,平时大家除了自己喜爱的开发工具外,我想每个人都有一个 mini编辑器吧, WinXP自带的记事本,我们既喜欢它的小巧玲珑,又苦于功能稍微偏弱,比如:不能语法高量显示、不能显示行号,这两个最大的缺陷,...

    minic-ide:MiniC 的 IDE,是构建在 Spoofax Language Workbench 之上的 C 语言的子集

    在结构方面,该项目分为单独的任务,共同形成三个主要的里程碑: MiniC 编辑器(语法分析、漂亮打印、代码模板、语法高亮、大纲视图) MiniC 分析器(名称分析、类型分析、约束检查、代码补全) MiniC 编译器(Java ...

Global site tag (gtag.js) - Google Analytics