- 浏览: 3056743 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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分享的概要
看到phyeas同学在试写JavaScript语法,顺便参一腿 =v=
本文里的代码放在附件里了,有需要的拿。
关于语法中左递归/右递归与规则的左结合/右结合的关系,我觉得就照着简单的表达式语法把推导过程画出来,找找感觉就能行。要注意的是推导结束后,把每步推导过程画成树(也就是解析树或者叫语法树),离根越远的节点在就越先被求值,也就是“优先级高”的表现了。写这帖的时候懒得画例子了……有必要再补充。
自顶向下的解析方法,如递归下降式或者LL式,一般无法支持左递归的语法,无聊是直接左递归还是间接左递归。这是因为它总是从推导规则中的第一个符号开始推,如果第一个符号就是自己或者间接回回到自己,那么解析过程就无法前进,就无限递归而出错了。(近年来有人提出过一些改进方案使自顶向下解析可以支持左递归,这帖里就不讨论了。有兴趣的同学可以阅读这篇论文:Packrat parsers can support left recursion)。
传统上,为了解决无法左递归的问题,可以改写语法规则,通过引入一个ε转换来把左递归变为右递归。但是这样得到的语法树的结合性就不对了,要得到正确的语法树需要做额外的工作来把树的形状转换回来。
LR系的解析方式则既支持左递归也支持右递归,写起语法来就轻松很多。结合性直接靠语法的递归位置就可以表达。
结合性有两个经典的应用场景,一是表达式的解析,二是if-else问题的解决。这帖主要着眼于前者。
表达式的形式比较固定,但传统上运算符有不同优先级,写语法的时候为了照顾优先级可以选择把相似的结构重复写在多个规则里,让这些规则的层次表达优先级的差别。但规则多了,状态图也就变复杂了。
通过显式指定运算符的优先级,语法中结构相似的规则可以写在同一条规则里,既简化了语法,对应的解析器的效率也更高。
GNU Bison是主要采用LALR(1)的解析器生成器。它支持显式指定规则的优先级以及结合性。
那么优先级能否跨规则而存在呢?先看个例子:
calc1.y
这是个简单的计算器,支持加、减、乘、除、负、幂等运算,并且可以通过括号改变表达式的结合性。注意到,所有表示“表达式”的规则都在同一个大规则expr里,它们的结合性和优先级则在语法文件的头部声明。
如果把expr改为下面的样子呢?
calc2.y
bison会抱怨说出现了5个递进/规约冲突。用bison -v calc2.y命令,查看calc2.output,可以看到冲突出现在状态17:
在这个状态时,下一个字符假如是+,那么既可以递进并转到状态10,也可以规约,于是就冲突了。
问题的关键就在于,这个“优先级”到底是干嘛用的。以calc1.y为例,如果没有指定运算符优先级,匹配到这样一个状态:
(“.”表示当前匹配的位置)
假如下一个符号是*,那么到底应该选择递进,变为:
还是规约,变为:
呢?
有了优先级,bison就可以比较递进与规约的选择间涉及的优先级;看到*的优先级比+高,于是选择递进。
而在calc2.y中,加减乘除幂这几个带优先级的运算符堆在了binop规则中。匹配该规则其实不需要优先级,单靠lookahead就足够了;在遇到加减乘数幂这几个运算符时,bison肯定会选择规约为binop;规约后,binop本身就不带有任何优先级信息了。而在expr规则中,需要优先级去区分递进或规约的expr binop expr子规则却得不到任何优先级信息,于是递进/规约冲突又冒出来了。
phyeas的问题:
答案是:不会。
进一步阅读:
首推自然是bison的手册。
这个帖子也可以读读,也是用表达式计算器为例子来讲解的。现在好困,不想码那么多字,既然有现成的解释我也就不用码了 =v=
本文里的代码放在附件里了,有需要的拿。
关于语法中左递归/右递归与规则的左结合/右结合的关系,我觉得就照着简单的表达式语法把推导过程画出来,找找感觉就能行。要注意的是推导结束后,把每步推导过程画成树(也就是解析树或者叫语法树),离根越远的节点在就越先被求值,也就是“优先级高”的表现了。写这帖的时候懒得画例子了……有必要再补充。
自顶向下的解析方法,如递归下降式或者LL式,一般无法支持左递归的语法,无聊是直接左递归还是间接左递归。这是因为它总是从推导规则中的第一个符号开始推,如果第一个符号就是自己或者间接回回到自己,那么解析过程就无法前进,就无限递归而出错了。(近年来有人提出过一些改进方案使自顶向下解析可以支持左递归,这帖里就不讨论了。有兴趣的同学可以阅读这篇论文:Packrat parsers can support left recursion)。
传统上,为了解决无法左递归的问题,可以改写语法规则,通过引入一个ε转换来把左递归变为右递归。但是这样得到的语法树的结合性就不对了,要得到正确的语法树需要做额外的工作来把树的形状转换回来。
LR系的解析方式则既支持左递归也支持右递归,写起语法来就轻松很多。结合性直接靠语法的递归位置就可以表达。
结合性有两个经典的应用场景,一是表达式的解析,二是if-else问题的解决。这帖主要着眼于前者。
表达式的形式比较固定,但传统上运算符有不同优先级,写语法的时候为了照顾优先级可以选择把相似的结构重复写在多个规则里,让这些规则的层次表达优先级的差别。但规则多了,状态图也就变复杂了。
通过显式指定运算符的优先级,语法中结构相似的规则可以写在同一条规则里,既简化了语法,对应的解析器的效率也更高。
GNU Bison是主要采用LALR(1)的解析器生成器。它支持显式指定规则的优先级以及结合性。
那么优先级能否跨规则而存在呢?先看个例子:
calc1.y
%{ #include <stdio.h> #include <ctype.h> #include <math.h> %} %union { double dval; } %token <dval> NUMBER %token POW %left '+' '-' %left '*' '/' %nonassoc UMINUS %right POW %type <dval> expr %% line : expr '\n' { printf("%lf\n", $1); } ; expr : NUMBER { $$ = $1; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { if (0 == $3) yyerror("divided by zero"); else $$ = $1 / $3; } | '-' expr %prec UMINUS { $$ = -$2; } | expr POW expr { $$ = pow($1, $3); } | '(' expr ')' { $$ = $2; } ; %% int main() { return yyparse(); } int yyerror(char* s) { fprintf(stderr, "%s\n", s); return 1; } int end = 0; int yylex() { if (end) return 0; int c; /* skip space */ while (' ' == (c = getchar())) { } if (isdigit(c)) { ungetc(c, stdin); scanf("%lf", &yylval); return NUMBER; } if ('*' == c) { c = getchar(); if ('*' == c) { return POW; } else { ungetc(c, stdin); return '*'; } } if ('\n' == c) { end = 1; } return c; }
这是个简单的计算器,支持加、减、乘、除、负、幂等运算,并且可以通过括号改变表达式的结合性。注意到,所有表示“表达式”的规则都在同一个大规则expr里,它们的结合性和优先级则在语法文件的头部声明。
如果把expr改为下面的样子呢?
calc2.y
expr : NUMBER { $$ = $1; } | expr binop expr { switch ($2) { case '+': $$ = $1 + $3; break; case '-': $$ = $1 - $3; break; case '*': $$ = $1 * $3; break; case '/': $$ = $1 / $3; break; case POW: $$ = pow($1, $3); break; } } | '-' expr { $$ = -$2; } | '(' expr ')' { $$ = $2; } ; binop : '+'| '-' | '*' | '/' | POW ;
bison会抱怨说出现了5个递进/规约冲突。用bison -v calc2.y命令,查看calc2.output,可以看到冲突出现在状态17:
state 17 3 expr: expr . binop expr 3 | expr binop expr . POW shift, and go to state 9 '+' shift, and go to state 10 '-' shift, and go to state 11 '*' shift, and go to state 12 '/' shift, and go to state 13 POW [reduce using rule 3 (expr)] '+' [reduce using rule 3 (expr)] '-' [reduce using rule 3 (expr)] '*' [reduce using rule 3 (expr)] '/' [reduce using rule 3 (expr)] $default reduce using rule 3 (expr) binop go to state 15
在这个状态时,下一个字符假如是+,那么既可以递进并转到状态10,也可以规约,于是就冲突了。
问题的关键就在于,这个“优先级”到底是干嘛用的。以calc1.y为例,如果没有指定运算符优先级,匹配到这样一个状态:
expr '+' expr .
(“.”表示当前匹配的位置)
假如下一个符号是*,那么到底应该选择递进,变为:
expr '+' expr '*' .
还是规约,变为:
expr .
呢?
有了优先级,bison就可以比较递进与规约的选择间涉及的优先级;看到*的优先级比+高,于是选择递进。
而在calc2.y中,加减乘除幂这几个带优先级的运算符堆在了binop规则中。匹配该规则其实不需要优先级,单靠lookahead就足够了;在遇到加减乘数幂这几个运算符时,bison肯定会选择规约为binop;规约后,binop本身就不带有任何优先级信息了。而在expr规则中,需要优先级去区分递进或规约的expr binop expr子规则却得不到任何优先级信息,于是递进/规约冲突又冒出来了。
phyeas的问题:
phyeas 写道
另外,想问下如果我在声明处定义如下:
%left PLUS
然后在规则处:
expression:
expression op expression
;
op:
PLUS
;
这样的华expression是否会应用上面定义的优先级?
%left PLUS
然后在规则处:
expression:
expression op expression
;
op:
PLUS
;
这样的华expression是否会应用上面定义的优先级?
答案是:不会。
进一步阅读:
首推自然是bison的手册。
这个帖子也可以读读,也是用表达式计算器为例子来讲解的。现在好困,不想码那么多字,既然有现成的解释我也就不用码了 =v=
- test_bison.zip (26.9 KB)
- 下载次数: 17
发表评论
-
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 21891之前有同学在做龙书(第二版)题目,做到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 48425刚写了个学习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 5271今天有朋友提到一个叫 ReflectASM的库,为Java环境 ... -
javac在编译创建内部类对象时生成的奇怪的getClass()调用是什么?
2011-06-14 22:17 4266有人问下面这段代码里,main()方法里的outer.new ... -
confluence property
2011-06-08 20:41 0http://en.wikipedia.org/wiki/Co ... -
JIT编译找不到类?
2011-05-09 22:28 5219今天开始Sun的老blog真的搬迁了,从blogs.sun.c ... -
几个简答题
2011-01-10 16:08 2465某题目 写道 龙书 写道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 3614这几天在休假在家,有空的时候在用ANTLR 3.2来写D 2. ...
相关推荐
以一个简单的算术表达式求值器为例,我们可能会有以下的解析规则: ```cpp expression -> term ((+ | -) term)* term -> factor ((* | /) factor)* factor -> number | (expression) number -> [0-9]+ ``` 这里,`...
在`calc.lex`文件中,Flex定义了一系列规则来识别不同类型的token,如变量([a-z])、整数([0-9]+)和运算符([-+()=*/\n])。例如,遇到字母时,它会返回一个VARIABLE token,并将字母转换为相应的ASCII值减去'a'。...
光伏风电混合并网系统Simulink仿真模型:光伏发电与风力发电的协同控制与并网逆变器设计,光伏风电混合并网系统simulink仿真模型。 系统有光伏发电系统、风力发电系统、负载、逆变器lcl大电网构成。 光伏系统采用扰动观察法实现mppt控制,经过boost电路并入母线; 风机采用最佳叶尖速比实现mppt控制,通过三相电压型pwm变器整流并入母线; 并网逆变器VSR采用基于电网电压定向矢量控制双闭环,经过lcl滤波器并入大电网。 ,核心关键词: 1. 光伏风电混合并网系统 2. Simulink仿真模型 3. 光伏发电系统 4. 风力发电系统 5. 负载 6. 逆变器LCL大电网 7. MPPT控制 8. 扰动观察法 9. Boost电路 10. 最佳叶尖速比 11. 三相电压型PWM变换器 12. VSR电网电压定向矢量控制双闭环 13. LCL滤波器 以上关键词用分号分隔为: 光伏风电混合并网系统;Simulink仿真模型;光伏发电系统;风力发电系统;负载;逆变器LCL大电网;MPPT控制;扰动观察法;Boost电路;最佳叶尖速比
DXP元器件库,初学者有用
2025专业技术人员继续教育公需课题库(附含答案).pptx
C++编写的资产管理系统(带SQLServer数据库文件。)。
Simulink下的MATLAB平台在智能电网微网运行控制中的并网仿真与逆变器控制策略探讨,Simulink:智能电网微网运行控制仿真及其参考资料 关键词:微电网 运行控制 仿真平台:MATLAB 主要内容:并网仿真 逆变器控制 下垂控制 ,关键词:微电网; 运行控制; Simulink仿真; MATLAB; 并网仿真; 逆变器控制; 下垂控制; 智能电网微网。,"Simulink在MATLAB平台下的微电网运行控制仿真研究及资料整合"
Matlab中的HMM隐马尔科夫与Markov马尔科夫时间序列预测源代码及数据集(可运行,适用于单变量预测),HMM隐马尔科夫时间序列预测 Markov马尔科夫时间序列预测(Matlab) 1.所有程序经过验证,保证可以运行 2.程序包括源码(主程序一个,子函数两个)和数据集; 3.程序适用于单变量时间序列预测。 注意:HMMP为主程序、data为数据集,其余m文件为函数文件,运行主文件HMMP即可。 ,HMM隐马尔科夫模型; 时间序列预测; Matlab程序; 验证可用; 主程序; 函数文件; 单变量预测; 包含源码与数据集。,"HMM与马尔科夫模型结合的时间序列预测程序(Matlab)验证版"
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
python学习练习游戏案例,详细备注解释代码,最适合初学者,练手学习,资源已上传欢迎下载学习
三菱FX系列自由口通讯程序详解:FX3U-232BD与上位机通讯及PLC与触摸屏应用,三菱FX自由口通讯程序 三菱FX系列自由口通讯程序 利用FX3U-232BD与上位机自由口通讯, 有PLC程序和触摸屏程序,通过连接三根线即可通讯 具有很好的学习意义和借鉴价值。 ,核心关键词:三菱FX系列; 自由口通讯程序; FX3U-232BD; 上位机; PLC程序; 触摸屏程序; 三线连接; 学习意义; 借鉴价值。,三菱FX系列自由口通讯程序:简易编程与实用连接指南
1990-2022年各省份基尼系数
Python自动化办公源码-60 pandas-matplotlib
MATLAB下的模型预测控制在楼宇负荷需求响应中的研究与应用:结合热力学与舒适度考量,MATLAB代码:基于模型预测控制的楼宇负荷需求响应研究 关键词:楼宇负荷 空调 模型预测控制 需求响应 参考文档:《Model Predictive Control of Thermal Storage for Demand Response》完全复现 仿真平台:MATLAB+CVX平台 主要内容:代码主要做的是一个建筑楼宇的需求响应问题,首先利用楼宇的储热特性,结合热力学方程构建了其储热模型,其次,考虑在动态能量电价的引导下,对楼宇负荷进行需求侧管理,从而能够对其负荷曲线进行改善,在需求响应的过程中也考虑了用户的舒适度,相对来讲比较全面,模型的求解采用的是较为创新的模型预测控制算法,更加创新,而且求解的效果更好,店主已经对代码进行了深入的加工和处理,出图效果非常好,代码质量非常高 ,关键词:楼宇负荷; 空调; 模型预测控制; 需求响应; 储热模型; 动态能量电价; 舒适度; MATLAB代码; CVX平台; 深入处理。,基于MATLAB的模型预测控制研究:楼宇负荷需求响应管理与优化
Prius 2004永磁同步电机设计报告:从理论到实践——磁路法、Maxwell仿真建模与温升分析,Prius2004永磁同步电机设计报告: 磁路法、maxwell有限元法、MotorCAD温仿真、应力分析。 (内容比较完善,用于很需要的朋友,不支持讲解,等额外服务哈。 ) 内容:: 1.Excell设计程序,可以了解这个电机是怎么设计出来的,已知功率转矩等,计算电机的体积,叠厚,匝数等。 2.Maxwell参数化仿真模型:可以学习参数化仿真模型,有限元结果可查看。 3. 橡树岭拆解和实测数据:官方的实测数据和差拆解报告。 4.maxwell prius2004建模仿真教程等:ppt资料一步一步教学怎么去建模 5.温升仿真分析,提供motor cad模型 ,磁路法; Maxwell有限元法; MotorCAD温仿真; 应力分析; Excell设计程序; Maxwell参数化仿真模型; 橡树岭拆解实测数据; Maxwelli Prius 2004建模仿真教程; 温升仿真分析; Motor CAD模型。,2004款Prius永磁同步电机设计报告:Excell程序与Maxwell有限元法融
基于Voronoi理论的维修站点选址算法研究.pdf
料箱输送线程序:PLC设备布局图及电气图纸集成系统(包含MultiControl控制卡等,采用STL开发,仅供学习参考),料箱输送线程序,带目的地跟踪,提供设备布局图和电气图纸以及博途程序。 程序语言较多使用了STL,程序仅供学习参考。 硬件配置:PLC:1515-2 PN HMI:TP700 Confort 主要设备有:英特诺直流辊筒电机,控制卡MultiControl;条码阅读器Sick CLV620; 和MiniLoad堆垛机通过Anybus模块通讯;称重模块品牌碧彩BIZERBA;还有使用丹佛斯变频器的提升机。 ,料箱输送线程序; 目的地跟踪; 设备布局图; 电气图纸; 博途程序; STL语言; PLC硬件配置; 英特诺直流辊筒电机; 控制卡MultiControl; 条码阅读器Sick CLV620; Anybus模块通讯; 称重模块碧彩BIZERBA; 丹佛斯变频器提升机。,"多设备集成:带目的地跟踪的料箱输送线博途程序"
1、资源内容地址:https://blog.csdn.net/2301_79696294/article/details/144634074 2、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题 3、适用对象:大学生,本科生,研究生小白可用,容易上手!!! 4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理
2025网络安全法竞赛题题库及参考答案.pptx