免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3934 | 回复: 11
打印 上一主题 下一主题

EBNF中的产生式program : stc { stc } ,在yacc的*.y文件中如何写规则? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-10 08:33 |只看该作者 |倒序浏览
1       %{
2       %}
3       %token ANB ORB LD ID LDI OR ORI AND ANI OUT SPC MPS MRD MPP STL
4       %%
5       program : stc { stc }
6       stc  :  stc1
7             | stc2
8             | output
9      stc1 :  i o
10    stc2  :  st stc1 { stc1 }
11    st  :  STL i
12    i  :    i i ANB
13    i  :  i i ORB
14    i  :  i vi
15    i  :  LD ID
16      | LDI ID
17    vi  :  OR ID
18        | ORI ID
19        |vo
20    vo : AND ID
21        | ANI ID   
22    o  :  o1
23        | o2   
24    o1  :  output { output }   
25    o1  :  output { output } ok output   
26    ok  :  ok i ANB   
27    ok  :  ok vo   
28    ok  :  i ANB
29             | vo   
30     output  :  OUT ID
31                 | SPC   
32     o2  :  omps { omrd } ompp   
33     omps  :  MPS oin   
34     omps  :  output MPS oin   
35     omrd  :  MRD oin   
36     ompp  :  MPP oin   
37     oin  :  o
38            | ok o1   
39
40     %%
41
42     int main()
43     {
44        return yyparse();
45     }


其中第5,10,24,25,32句的yacc的*.y文件中应如何写规则?因为EBNF中的{}在yacc中变成了动作语句了,谢谢

[ 本帖最后由 liuzq71 于 2009-2-10 08:36 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2009-02-10 09:07 |只看该作者
program : stc
|stc program ;

论坛徽章:
0
3 [报告]
发表于 2009-02-10 10:19 |只看该作者
原帖由 cjaizss 于 2009-2-10 09:07 发表
program : stc
|stc program ;


能否邦我将1楼的其中第5,10,24,25,32句的规则全部重改写一下?被文法弄得晕死了,yacc只适应BNF不适应EBNF

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2009-02-10 10:35 |只看该作者
那我觉得你还是好好学学yacc,这个改写应该还是比较基础的.

  1. 10 stc2  :  st stc1 { stc1 }
  2. stc2:st stc1|stc2 stc1;
  3. 24    o1  :  output { output }   
  4. 25    o1  :  output { output } ok output   
  5. o1: ox2 | ox2 okooutput;
  6. ox2:output|output ox2;
  7. 32     o2  :  omps { omrd } ompp   
  8. o2:omps ox ompp;
  9. ox: | omrd ox;
复制代码

我想错了,24,25和IF-ELSE的悬挂是不同的

[ 本帖最后由 cjaizss 于 2009-2-10 10:42 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-02-10 10:50 |只看该作者
原帖由 cjaizss 于 2009-2-10 10:35 发表
那我觉得你还是好好学学yacc,这个改写应该还是比较基础的.

10 stc2  :  st stc1 { stc1 }
stc2:st stc1|stc2 stc1;
24    o1  :  output { output }   
25    o1  :  output { output } ok output   
o ...



32     o2  :  omps { omrd } ompp   
o2:  omps ox ompp;
ox: | omrd ox;

是不是改成?:
o2 : omps ox ompp
ox : /*epsilon*/                           或者:    ox : omrd ox
      | omrd ox                                             | /*epsilon*/

[ 本帖最后由 liuzq71 于 2009-2-10 10:57 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2009-02-10 11:12 |只看该作者
恩,是的

论坛徽章:
0
7 [报告]
发表于 2009-02-10 11:14 |只看该作者


yacc处理*.y文件出现以上错误,是什么原因?每行错误前的数字指的是什么?是第n条产生式还是*.y的第行号?多谢

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2009-02-10 12:34 |只看该作者
第一,yacc后面要用分号隔开;
第二,你的语言好象不能用yacc处理.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
9 [报告]
发表于 2009-02-10 13:22 |只看该作者
不过我用bison编了一个,发现bison居然能识别这种语言,其原理我还不知道,可能我对GLR的认识有误解.
test.l

  1. %{
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "y.tab.h"
  5. %}
  6. %%
  7. \n {return 0;}
  8. . {return yytext[0];}
  9. %%
复制代码

test.y

  1. %{
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. %}
  5. %%
  6. x:x x 'a'
  7. | 'b';
  8. %%
  9. int main()
  10. {
  11.         yyparse();
  12. }
复制代码

Makefile

  1. test:test.y test.l
  2.      yacc -d test.y
  3.      lex test.l
  4.      gcc lex.yy.c y.tab.c -ll -ly -o $@
复制代码

论坛徽章:
0
10 [报告]
发表于 2009-02-10 14:09 |只看该作者
myplc1.y文件:

%{
#include <stdio.h>
#include <stdlib.h>
%}
%token ANB ORB LD ID LDI OR ORI AND ANI OUT SPC MPS MRD MPP STL
%%
program: stc
         | stc program
;
stc:  stc1
      | stc2
      | output
;
stc1:  i o
;
stc2:  st stc1
       | stc2  stc1
;
st:  STL i
;
i:  i i ANB
    | i i ORB
    | i vi
    | LD ID
    | LDI ID
;
vi: OR ID
    | ORI ID
    | vo
;
vo: AND ID
    | ANI ID
;   
o: o1
   | o2
;  
o1: ox2
    | ox2 ok output
;
ox2: output
     |output ox2
;
ok: ok i ANB   
    | ok vo   
    | i ANB
    | vo
;  
output:  OUT ID
             | SPC
;  
o2: omps ox ompp
;
ox:
    | omrd ox
;
omps:  MPS oin   
       |output MPS oin
;  
omrd:  MRD oin
;  
ompp:  MPP oin
;   
oin:  o
      | ok o1   
;
%%

int main()
{
   return yyparse();
}
/*yylex()手工写出*/
int yylex (void)
{
   return 0;
}
/*错误处理,简单地打印出来*/
void yyerror (char const *s)
{
    fprintf (stderr, "%s\n", s);
}

这里的错误提示前的数字是指的什么?
出现以上错误提示,没折了,请邦忙解决下啊,谢谢

[ 本帖最后由 liuzq71 于 2009-2-10 14:51 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP