亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 6008 | 回復(fù): 2
打印 上一主題 下一主題

yacc不使用優(yōu)先規(guī)則解決移進(jìn)/規(guī)約沖突的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-11-12 17:42 |只看該作者 |倒序?yàn)g覽
本帖最后由 一刀。 于 2012-11-12 17:46 編輯

初學(xué)lex和yacc,書上有兩個例子,一個是使用優(yōu)先規(guī)則的運(yùn)行沒有問題,另一個不使用優(yōu)先規(guī)則的死活跑不過去,甚至連乘法除法都有問題,請大牛指教一下

下面這個是詞法分析程序
  1. %{
  2. #include "y.tab.h"
  3. extern int yylval;
  4. %}

  5. %%
  6. [0-9]+  { yylval = atoi(yytext); return NUMBER; }
  7. [ \t]+  ;
  8. \n return 0;
  9. [_a-zA-Z][_a-zA-Z0-9]*  { return NAME; }
  10. [=\*\/\(\)\+\-]         { return yytext[0]; }
  11. %%
復(fù)制代碼
下面這個是使用有限規(guī)則的語法分析程序,運(yùn)行沒有問題
  1. %{
  2. #include <stdio.h>
  3. %}

  4. %token NAME NUMBER
  5. %left '-' '+'
  6. %left '*' '/'
  7. %nonassoc UMINUS

  8. %%
  9. statement: NAME '=' expression
  10.   | expression { printf("= %d\n", $1); }
  11.   ;

  12. expression: expression '+' expression { $$ = $1 + $3; }
  13.   | expression '-' expression         { $$ = $1 - $3; }
  14.   | expression '*' expression         { $$ = $1 * $3; }
  15.   | expression '/' expression
  16.     {
  17.       if($3 == 0)
  18.         yyerror("divide by zero");
  19.       else
  20.         $ = $1 / $3;
  21.     }
  22.   | '-' expression %prec UMINUS       { $$ = -$2; }
  23.   | '(' expression ')'                { $$ = $2; }
  24.   | NUMBER                            { $$ = $1; }
  25.   ;
  26. %%

  27. extern FILE *yyin;

  28. int main()
  29. {
  30.         do
  31.         {
  32.                 yyparse();
  33.         }
  34.         while(!feof(yyin));
  35. }
復(fù)制代碼
下面這個是不使用優(yōu)先規(guī)則的程序,乘法、除法和小括號都有問題
  1. %{
  2. #include <stdio.h>
  3. %}

  4. %token NAME NUMBER

  5. %%
  6. statement: NAME '=' expression
  7.   | expression { printf("= %d\n", $1); }
  8.   ;

  9. expression: expression '+' mulexp { $$ = $1 + $3; }
  10.   | expression '-' mulexp  { $$ = $1 - $3; }
  11.   | primary                { $$ = $1; }
  12.   ;

  13. mulexp: mulexp '*' primary { $$ = $1 * $3; }
  14.   | mulexp '/' primary
  15.     {
  16.       if($3 == 0)
  17.         yyerror("divide by zero");
  18.       else
  19.         $$ = $1 / $3;
  20.     }
  21.   | primary
  22.   ;

  23. primary: '(' expression ')' { $$ = $2; }
  24.   | '-' primary             { $$ = -$2; }
  25.   | NUMBER                  { $$ = $1; }
  26.   ;

  27. %%

  28. extern FILE *yyin;

  29. int main()
  30. {
  31.         do
  32.         {
  33.                 yyparse();
  34.         }
  35.         while(!feof(yyin));
  36. }
復(fù)制代碼

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
2 [報(bào)告]
發(fā)表于 2012-11-12 20:03 |只看該作者
一刀。 發(fā)表于 2012-11-12 17:42
初學(xué)lex和yacc,書上有兩個例子,一個是使用優(yōu)先規(guī)則的運(yùn)行沒有問題,另一個不使用優(yōu)先規(guī)則的死活跑不過去, ...

你的乘法和除法都無法被規(guī)約成statement,當(dāng)然是語法錯誤
在你的程序中,乘法和除法唯一可以被規(guī)約成statement的機(jī)會是
expression: expression '+' mulexp
expression: expression '-' mulexp
也就是前面必須要有加減法
所以以下都是不符合你的語法的
linux-s3hu:/tmp/compile # ./a.out
2*3
= 2
syntax error
= 3

linux-s3hu:/tmp/compile # ./a.out
2*3+1
= 2
syntax error
= 4

以下才符合你的語法
linux-s3hu:/tmp/compile # ./a.out
1+2*3
= 7

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-11-12 20:31 |只看該作者
本帖最后由 一刀。 于 2012-11-12 20:40 編輯

回復(fù) 2# cjaizss


    謝謝!我把primary改成mulexp通過了。我看書不仔細(xì)
  1. %{
  2. #include <stdio.h>
  3. %}

  4. %token NAME NUMBER

  5. %%
  6. statement: NAME '=' expression
  7.   | expression { printf("= %d\n", $1); }
  8.   ;

  9. expression: expression '+' mulexp { $$ = $1 + $3; }
  10.   | expression '-' mulexp  { $$ = $1 - $3; }
  11.   | mulexp                { $$ = $1; }
  12.   ;

  13. mulexp: mulexp '*' primary { $$ = $1 * $3; }
  14.   | mulexp '/' primary
  15.     {
  16.       if($3 == 0)
  17.         yyerror("divide by zero");
  18.       else
  19.         $ = $1 / $3;
  20.     }
  21.   | primary
  22.   ;

  23. primary: '(' expression ')' { $$ = $2; }
  24.   | '-' primary             { $$ = -$2; }
  25.   | NUMBER                  { $$ = $1; }
  26.   ;

  27. %%

  28. extern FILE *yyin;

  29. int main()
  30. {
  31.         do
  32.         {
  33.                 yyparse();
  34.         }
  35.         while(!feof(yyin));
  36. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP