社区
C++ 语言
帖子详情
100分求布尔表达式LR分析表
fireinthehole
2005-06-20 11:28:53
我在网上找了一下,《编绎原理实践教程》这本书上有,可是我附近的书店都没这本书,请有的大哥帮下忙。
或者高手帮忙推导一下,我已经焦头烂额了……
...全文
189
12
打赏
收藏
100分求布尔表达式LR分析表
我在网上找了一下,《编绎原理实践教程》这本书上有,可是我附近的书店都没这本书,请有的大哥帮下忙。 或者高手帮忙推导一下,我已经焦头烂额了……
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fireinthehole
2005-06-20
打赏
举报
回复
我的课程设计题目的是这样的:
题目:布尔表达式的翻译程序(最好用C++编写)
方法:LR分析法
输出中间代码:四元式
要求:写出布尔表达式的符合分析方法要求的文法,编号分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
书上给出的最初文法为:
E→E or E|E and E|not E|(E)|id relop id|id
由于要输出四元式,书上又给出文法:
E→E1 or M E2|E1 and M E2|not E1|(E1)|id1 relop id2|id
M→ε
其中M是为了便于在适当的时候执行一个语义动作,记住下一个将要产生的四元式标号
E1 E2 是算术表达式,relop为关系元算符(≤≥≠=<>)
我觉得为了定义符号优先级,于是改写文法如下,不知道是否正确:
E→E or M F|F
F→F and M G|G
G→not G|(E)|id relop id|id
M→ε
这次课程设计的题目难死了,关键在于推导出LR分析表,可是我已经尽力了,还是推不出来,请各位能够抽出一点空闲,对小弟指点一二。
flying_dancing
2005-06-20
打赏
举报
回复
把你的表达示(文法)写出来............
Kevin_qing
2005-06-20
打赏
举报
回复
你把bnf写来,我给你表
fireinthehole
2005-06-20
打赏
举报
回复
对了,似乎and和or优先级是一样的,但是离散数学书上优先级从高到低是not and or,这个问题怎么解决?
Kevin_qing
2005-06-20
打赏
举报
回复
unsigned long table[][6]={
应该是
unsigned long table[][9]={
Kevin_qing
2005-06-20
打赏
举报
回复
上面的是LALR分析表,已经构造好了
比如
state 0
IDENTshift, and go to state 1
LOGIC_OP1shift, and go to state 2
'(' shift, and go to state 3
factorgo to state 4
COMP_EXPRgo to state 5
LOGIC_EXPRgo to state 6
就是状态0时,输入为 IDENT 就移进 然后转换到状态1
LOGIC_OP1时移进,转换到2
'(' 转换到3
那么可以写分析表为
#define ERR ~0
#define S(x) (0x10000000|x)
#define R(x) (0x20000000|x)
#define G(x) (0x30000000|x)
unsigned long table[][6]={
//IDENT------'('------')'--------'LOGIC_OP1---------LOGIC_OP2-----CMP_OP-----FACTOR-----CMP_EXPR----LOGIC_EXPR
/*S0*/{ S(1), S(3) ERR S(2), ERR , ERR , G(4), G(5),G(6)},
//S1 .......
//S12.....
};
fireinthehole
2005-06-20
打赏
举报
回复
我碰到了一个问题,从我目前来学的,我只会用文法来推导出项目集,然后构造LR分析表,也就是那种矩阵式表格,我把上面的代码形式的分析表画成了DFA,下一步应该如何构造成分析表,构造规范LR分析表还是LALR分析表?
fireinthehole
2005-06-20
打赏
举报
回复
直接用switch实现的话是不是按顺序从state 0 到state 15进行?
fireinthehole
2005-06-20
打赏
举报
回复
谢谢这位大哥,如有不懂的问题还要向你请教哦
Kevin_qing
2005-06-20
打赏
举报
回复
根据上面的状态转换写程序撒
至于你想用分析表或者直接用switch实现就随你了
shift是移进
reduce是规约
goto是转换状态
使用的是LALR分析
fireinthehole
2005-06-20
打赏
举报
回复
这位兄台,能否告知一二在编程的事后如何实现?
Kevin_qing
2005-06-20
打赏
举报
回复
%token COMP_OP IDENT LOGIC_OP1 LOGIC_OP2
%start LOGIC_EXPR
%%
factor : IDENT
| '(' COMP_EXPR ')'
;
COMP_EXPR
: factor
| COMP_EXPR COMP_OP factor
;
LOGIC_EXPR
: COMP_EXPR
| LOGIC_OP1 COMP_EXPR
| LOGIC_EXPR LOGIC_OP2 COMP_EXPR
;
COMP_OP指代 >, <, ==, >= ,<= ,!=
LOGIC_OP1指代 !
LOGIC_OP2指代 && ||
分析表
Grammar
rule 1 factor -> IDENT
rule 2 factor -> '(' COMP_EXPR ')'
rule 3 COMP_EXPR -> factor
rule 4 COMP_EXPR -> COMP_EXPR COMP_OP factor
rule 5 LOGIC_EXPR -> COMP_EXPR
rule 6 LOGIC_EXPR -> LOGIC_OP1 COMP_EXPR
rule 7 LOGIC_EXPR -> LOGIC_EXPR LOGIC_OP2 COMP_EXPR
Terminals, with rules where they appear
$ (-1)
'(' (40) 2
')' (41) 2
error (256)
COMP_OP (258) 4
IDENT (259) 1
LOGIC_OP1 (260) 6
LOGIC_OP2 (261) 7
Nonterminals, with rules where they appear
factor (9)
on left: 1 2, on right: 3 4
COMP_EXPR (10)
on left: 3 4, on right: 2 4 5 6 7
LOGIC_EXPR (11)
on left: 5 6 7, on right: 7
state 0
IDENT shift, and go to state 1
LOGIC_OP1 shift, and go to state 2
'(' shift, and go to state 3
factor go to state 4
COMP_EXPR go to state 5
LOGIC_EXPR go to state 6
state 1
factor -> IDENT . (rule 1)
$default reduce using rule 1 (factor)
state 2
LOGIC_EXPR -> LOGIC_OP1 . COMP_EXPR (rule 6)
IDENT shift, and go to state 1
'(' shift, and go to state 3
factor go to state 4
COMP_EXPR go to state 7
state 3
factor -> '(' . COMP_EXPR ')' (rule 2)
IDENT shift, and go to state 1
'(' shift, and go to state 3
factor go to state 4
COMP_EXPR go to state 8
state 4
COMP_EXPR -> factor . (rule 3)
$default reduce using rule 3 (COMP_EXPR)
state 5
COMP_EXPR -> COMP_EXPR . COMP_OP factor (rule 4)
LOGIC_EXPR -> COMP_EXPR . (rule 5)
COMP_OP shift, and go to state 9
$default reduce using rule 5 (LOGIC_EXPR)
state 6
LOGIC_EXPR -> LOGIC_EXPR . LOGIC_OP2 COMP_EXPR (rule 7)
$ go to state 14
LOGIC_OP2 shift, and go to state 10
state 7
COMP_EXPR -> COMP_EXPR . COMP_OP factor (rule 4)
LOGIC_EXPR -> LOGIC_OP1 COMP_EXPR . (rule 6)
COMP_OP shift, and go to state 9
$default reduce using rule 6 (LOGIC_EXPR)
state 8
factor -> '(' COMP_EXPR . ')' (rule 2)
COMP_EXPR -> COMP_EXPR . COMP_OP factor (rule 4)
COMP_OP shift, and go to state 9
')' shift, and go to state 11
state 9
COMP_EXPR -> COMP_EXPR COMP_OP . factor (rule 4)
IDENT shift, and go to state 1
'(' shift, and go to state 3
factor go to state 12
state 10
LOGIC_EXPR -> LOGIC_EXPR LOGIC_OP2 . COMP_EXPR (rule 7)
IDENT shift, and go to state 1
'(' shift, and go to state 3
factor go to state 4
COMP_EXPR go to state 13
state 11
factor -> '(' COMP_EXPR ')' . (rule 2)
$default reduce using rule 2 (factor)
state 12
COMP_EXPR -> COMP_EXPR COMP_OP factor . (rule 4)
$default reduce using rule 4 (COMP_EXPR)
state 13
COMP_EXPR -> COMP_EXPR . COMP_OP factor (rule 4)
LOGIC_EXPR -> LOGIC_EXPR LOGIC_OP2 COMP_EXPR . (rule 7)
COMP_OP shift, and go to state 9
$default reduce using rule 7 (LOGIC_EXPR)
state 14
$ go to state 15
state 15
$default accept
布尔
表
达式
的语法
分析
及语义
分析
程序设计
能读取词法
分析
结果进行语法
分析
,在语法
分析
的同时进行语义
分析
,生成中间代码;采用
LR
分析
法的实现
编译原理课程设计-
布尔
表
达式
的翻译器
该文件包含编译原理课程
布尔
表
达式
翻译器的源程序以及撰写的报告。非常完整。
Python 编程基础
从基础的数据类型,如整数、字符串和
布尔
值,到更高级的概念,如正则
表
达式
和命名空间,这里都有详尽的解释和示例。 专栏首先介绍了Python的五种基础数据类型,快速掌握如何存储和操作数据。将学习到Python的八种...
《编译原理》课程设计指导书 算术
表
达式
的语法
分析
及语义
分析
程序设计。
通过设计、编制、调试一个算术
表
达式
的语法及语义
分析
程序,加深对语法及语义
分析
原理的理解,并实现词法
分析
程序对单词序列的词法检查和
分析
。 2.设计内容及要求: 算术
表
达式
的文法: 〈无符号整数〉∷= ...
类C语言编译器,基本上实现了主要功能的C语言语法,词法
分析
使用状态转移,语法使用
LR
(1)方法,自动生成ACTION和GOTO转移
表
。自顶向下的语法制导翻译,可以生成各种类型的
表
达式
(包括
布尔
,算术,逻辑等等),循环中的while,选择中的if else 和if等,功能比较强大,对于应付编译原理课程设计足足有余。此代码是本人课程设计的心血。
类C语言编译器,基本上实现了主要功能的C语言语法,词法
分析
使用状态转移,语法使用
LR
(1)方法,自动生成ACTION和GOTO转移
表
。自顶向下的语法制导翻译,可以生成各种类型的
表
达式
(包括
布尔
,算术,逻辑等等),...
C++ 语言
64,647
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章