- 论坛徽章:
- 0
|
我的代码是:
//myplc.y
%{
#define YYSTYPE double //定义语义值的C数据类型
#include <math.h>
#include <stdio.h>
#include <ctype.h>
#include "y.tab.h"
int yylex();
void yyerror(char const *s);
int i,yylineno;
char *strs[]={"LD","OR","OUT","LD","AND","OUT"};
int lines[]={6,LD,OR,OUT,LD,AND,OUT};
%}
%token ANB ORB LD LDI OR ORI AND ANI OUT SPC MPS MRD MPP STL RET BLANK //ID
//%left LD LDI OUT SPC
%%
program : stc1
| program stc1
;
stc1 : i o1
;
i : i i ANB
| i i ORB
| i vi
| LD
| LDI
;
vi : OR
| ORI
| vo
;
vo : AND
| ANI
;
o1 : o1x // o1 -> output {output},多个并列单输出
| o1x ok output // -> output {output} ok output,多个并列单输出,并在最后一个输出前有输入块
;
o1x : output //BLANK
| o1x output
;
ok : ok i ANB
| ok vo
| i ANB //ok的这一个产生式有错误
| vo
;
output : OUT
| SPC
;
%%
int yylex()
{
int j=i++;
if(i>lines[0]) return -1; //结束输入
else
{
printf("%s\n",strs[j]);
yylineno=j+1;
return lines[j+1];
}
}
/*void yyerror(char* s, int state){
fprintf(stderr, "%s\n", s);
if(state != -1){
fprintf(stderr, "line %d: ", yylineno);
//fprintf(stderr, "%s expected ", yyerrmtx[state]);
fprintf(stderr, "before\"%s\"\n", yytext);
}//if
}*/
void yyerror (char const *s)
{
fprintf (stderr, "line=%d,%s!\n", yylineno,s);
}
int yywrap()
{
return 1;
}
int main()
{
return yyparse();
}
[ 本帖最后由 liuzq71 于 2009-2-20 12:20 编辑 ] |
|