- 浏览: 3053469 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
MiniJava语言参考。引用自Modern Compiler Implementation in Java, Second Edition,Appendix A, Page 484-486。
下面是MiniJava语法的EBNF。粗体蓝色的表示terminals,斜体的是non-terminals。星号(*)表示出现0或多次。
(注释:op表示二元运算符,可以是: && < + - *的任意一个;
.length只能作用于int[]类型的变量上。)
本来是想找找比较简单的实例,看看别人是如何实现类(class)的作用域的。然而这MiniJava真作 弊,居然强制要求变量声明在方法声明之前,于是我遇到的问题在一定程度上给避开了。Hmm……我再想想看怎么办好……
嗯,scoping是语义分析的部分而不是词法或语法分析的部分。不过syntax-directed translation的方式会在grammar中嵌入语义相关的action,这里会使语法文件牵扯到一点语义的处理问题。
例如说
很可能会在看到'{'之后去嵌入{ $env = $env.push(new Environment($env)); }之类的,然后在看到'}'的时候pop掉那个scope。
或者即便是先生成AST,然后用tree walker去做语义分析,也可以在tree grammar里嵌入这些action。所以想看看别人是怎么做(嵌入的action)的。并不是跟语法有直接的关系咯。
我说MiniJava偷懒主要是限制了成员变量声明要在方法声明之前,而方法体里的语句也要在局部变量声明之后;这样使得对成员变量的访问问题比较容易解决,而方法对别的方法的引用则没有解决(仍然可以引用在自己之后出现的方法)。
不是,这个是可以设置的。看具体的解析器生成器的规格,或者自己手写解析器的话更容易控制。
yacc-like的解析器生成器都可以指定运算符的优先级……这个不是问题。
我遇到的问题是class-scope的问题。一般的scope都是declare before use,但class-scope却意味着class内的declaration在整个class-scope内都有效(即使在代码上声明在使用的后面也没关系),这问题挺麻烦的,我想看看别人是怎么实现的。不然按我偷懒的办法这效率就……T T
下面是MiniJava语法的EBNF。粗体蓝色的表示terminals,斜体的是non-terminals。星号(*)表示出现0或多次。
引用
Program → MainClass ClassDecl*
MainClass → class id { public static void main(String[ ] id) { Statement* } }
ClassDecl → class id { VarDecl* MethodDecl* }
_________ → class id extends id { VarDecl* MethodDecl* }
VarDecl → Type id ;
MethodDecl → public Type id ( FormalList ) { VarDecl* Statement* return Exp; }
FormalList → Type id FormalRest*
_________ →
FormalRest → , Type id
Type → int[]
____ → boolean
____ → int
____ → id
Statement → { Statement* }
_________ → if ( Exp ) Statement else Statement
_________ → while ( Exp ) Statement
_________ → System.out.println(Exp);
_________ → id = Exp;
_________ → id[Exp] = Exp;
Exp → Exp op Exp
___ → Exp [Exp]
___ → Exp .length
___ → Exp . id (ExpList)
___ → INTEGER_LITERAL
___ → true
___ → false
___ → id
___ → this
___ → new int[Exp]
___ → new id( )
___ → !Exp
___ → (Exp)
ExpList → Exp ExpRest*
_______ →
ExpRest → , Exp
MainClass → class id { public static void main(String[ ] id) { Statement* } }
ClassDecl → class id { VarDecl* MethodDecl* }
_________ → class id extends id { VarDecl* MethodDecl* }
VarDecl → Type id ;
MethodDecl → public Type id ( FormalList ) { VarDecl* Statement* return Exp; }
FormalList → Type id FormalRest*
_________ →
FormalRest → , Type id
Type → int[]
____ → boolean
____ → int
____ → id
Statement → { Statement* }
_________ → if ( Exp ) Statement else Statement
_________ → while ( Exp ) Statement
_________ → System.out.println(Exp);
_________ → id = Exp;
_________ → id[Exp] = Exp;
Exp → Exp op Exp
___ → Exp [Exp]
___ → Exp .length
___ → Exp . id (ExpList)
___ → INTEGER_LITERAL
___ → true
___ → false
___ → id
___ → this
___ → new int[Exp]
___ → new id( )
___ → !Exp
___ → (Exp)
ExpList → Exp 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
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 .... 就是说没有二元操作符优先顺序了……
发表评论
-
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
基于LLVM实现VM的JIT的一些痛点
2014-01-07 17:25 0同事Philip Reames Sanjoy Das http ... -
《自制编程语言》的一些笔记
2013-11-24 00:20 0http://kmaebashi.com/programmer ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21887之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48399刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ... -
Building Blocks of a JavaScript Engine
2013-05-23 00:49 0sketches of my new book "B ... -
读《JavaScript语言精髓与编程实践(第二版)》
2013-05-21 00:32 02008年逛书店的时候偶 ... -
添加一个bool C1LateInline参数?
2011-11-25 16:03 0之前我试过给Phi加exact_type不行,那如果像C2一样 ... -
别测空循环
2011-06-23 21:56 5268今天有朋友提到一个叫 ReflectASM的库,为Java环境 ... -
javac在编译创建内部类对象时生成的奇怪的getClass()调用是什么?
2011-06-14 22:17 4257有人问下面这段代码里,main()方法里的outer.new ... -
confluence property
2011-06-08 20:41 0http://en.wikipedia.org/wiki/Co ... -
JIT编译找不到类?
2011-05-09 22:28 5207今天开始Sun的老blog真的搬迁了,从blogs.sun.c ... -
几个简答题
2011-01-10 16:08 2459某题目 写道 龙书 写道In addition to a c ... -
循环中的字符串拼接的优化
2010-12-09 20:46 0public class StringConcatDemo { ... -
Velocity模板的编译
2010-11-15 14:49 0http://ecee.colorado.edu/ecen45 ... -
ANTLR里迭代子规则的一个注意点
2010-09-27 15:31 3609这几天在休假在家,有空的时候在用ANTLR 3.2来写D 2. ...
相关推荐
1. **MiniJavaParser.java**:这是MiniJava语法解析器的实现,基于词法分析器生成的语法树。它将源代码的字符流转换为抽象语法树(AST),这个过程通常由解析器完成。在MiniJava项目中,这个解析器解析MiniJava源...
在MiniJava编译器的情况下,它的主要任务是将符合MiniJava语法规则的程序转换为可执行的代码。这个过程通常分为词法分析、语法分析、语义分析和代码生成四个阶段。 1. **词法分析**:此阶段,编译器将源代码分解为...
MiniJava的语法规则相对简单,易于实现。 - **语义分析**:检查程序的语义是否正确,如类型检查、变量声明等,并生成中间代码或直接目标代码。 - **代码生成**:将中间代码转换为特定平台的目标代码,如x86汇编或...
COMP 520:编译器PA2 - 抽象语法树编译器项目的第二个里程碑是为任何根据我们的 miniJava 语法在句法上有效的 miniJava 程序创建抽象语法树 (AST)。 此作业要求您结合 Java 运算符优先级规则,并使用本文档中概述的...
2. 语法分析:接着,语法分析器(Parser)会根据预定义的文法规则,检查标记序列是否符合MINIJAVA的语法规则,生成抽象语法树(AST)。AST直观地反映了程序的结构,为后续的语义分析提供便利。 3. 语义分析:在这一...
第 1 部分:MiniJava 类型检查器 程序 准备 JavaCC 和 JTB 将minijava.jj给 JTB,JTB 将生成jtb.out.jj 将jtb.out.jj给 JavaCC,JavaCC 会产生一些 java 文件,唯一有用的 Java 文件是MiniJavaParser.java 创建主...
Minijava是一种简化版的Java,保留了其核心语法特性,但去除了部分复杂特性,便于教学和理解。 一、Minijava语言简介 Minijava是Java语言的一个简化版本,主要用于教学目的。它保留了Java的主要结构,如类定义、...
MiniJava是一种教学用的编程语言,它保留了Java的核心语法特性,如类、方法、变量声明和控制流结构,但去除了高级特性,如多线程、异常处理和泛型等。MiniJava的设计目的是为了便于分析、理解和实现编译器。它的编译...
2. **语法分析**:接下来,编译器根据MiniJava的语法规则检查标记流,构建抽象语法树(AST)。这个过程通常由递归下降解析器完成,它确保输入代码符合语言的句法结构。 3. **语义分析**:在语义分析阶段,编译器...
实现的是一个MiniJava的扩展语言, 1)添加了double类型,及其数组。 2)实现了do while语句 3)使用嵌入java代码的方式实现了自行构造语法树,节点类ANode请自行实现 ANode类很简单,如果不要实现其它功能,直接用...
总而言之,minijavacompiler是学习编译原理和Java编程语言的一个宝贵资源,通过实践它可以加深对编程语言理论、编译技术以及Java语法的理解。无论是作为教学工具还是研究项目,minijavacompiler都提供了一个实际操作...
第一个任务是为 miniJava 构建一个扫描器和解析器,以识别语法正确的程序。 迷你Java miniJava 语言是 Java 的一个子集。 每个 miniJava 程序都是具有 Java 语义的合法 Java 程序。 以下是对定义 miniJava 的 Java...
贪吃蛇的java简单源码MiniJava 编译器 MiniJava 是一种帮助学生理解编译器理论的教学语言。 MiniJava 的介绍可以在教科书中找到。 在项目中,MiniJava编译器是用Java编写的。 与其他 MiniJava 项目不同,这是一个...
- **易学易用**:语法简洁,学习曲线平缓,让开发者能快速上手。 - **提高效率**:通过jQuery,开发者可以减少编写代码的数量,同时增强代码可读性和维护性。 ### miniUI Java与jQuery 提到“miniui_java”,这...
适用于MiniJava的MIPS编译器 设置 构建:使用ant运行 。 测试:使用junit运行套件。 (可选)在Eclipse中突出显示JastAdd语法: 。 然后在“首选项”下的“文件” -> “编辑器” -> “文件关联”下,将“ * ....
这是一个示例 MiniJava 语法(BNF 表示法),可用于编译器的解析器。 注意:此语法只是一个示例。 您可以在项目的第一阶段根据您的设计将其更改为您的需要。 Goal :: = MainClass ( ClassDeclaration ) * Main...
用于生成源代码的antlr语法位于src / main / antlr4 / minijava.g4中。AST由类ASTGenerator构建,该类继承自minijavaBaseListener。 它的源文件是src / main / java / minijava / ASTGenerator.java 符号表由...
在这个过程中,你将需要用到一些工具和理论,比如正则表达式用于词法分析,上下文无关文法(Context-Free Grammar, CFG)描述MiniJava的语法,以及类型系统和作用域规则来实现语义分析。 在实际开发时,你可能会...
它是一种简化的Java语法,去除了许多高级特性,如异常处理、多线程、反射等,以使编译器的实现更为简洁。这个简化版的语言保留了基本的类结构、方法定义、变量声明、运算符以及控制流语句,使得初学者能够专注于...
- 当运行`jjtree minijava.jjt`时,JJTree会生成一系列的Java源文件,包括一个新的`.jj`文件(在这个例子中是`minijava.jj`),这个文件包含了JJTree处理后的语法规则,以及表示AST节点的类。 3. **生成的Java文件...