100分求布尔表达式LR分析表

fireinthehole 2005-06-20 11:28:53
我在网上找了一下,《编绎原理实践教程》这本书上有,可是我附近的书店都没这本书,请有的大哥帮下忙。
或者高手帮忙推导一下,我已经焦头烂额了……
...全文
189 12 打赏 收藏 转发到动态 举报
写回复
用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

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧