我已经编写了一个 .l 文件并希望在“c17.isc”中输出内容。
但是有一个错误我不知道为什么。我已经给出了我打算阅读的文件、flex 文件和执行结果。
这是c17.isc文件内容的意思
number gate_name gate_type output_number input_number fault
带有“from”的行表示扇出。有 2 个数字的行仅表示输入列表。
*c17 iscas example (to test conversion program only)
*---------------------------------------------------
*
*
* total number of lines in the netlist .............. 17
* simplistically reduced equivalent fault set size = 22
* lines from primary input gates ....... 5
* lines from primary output gates ....... 2
* lines from interior gate outputs ...... 4
* lines from ** 3 ** fanout stems ... 6
*
* avg_fanin = 2.00, max_fanin = 2
* avg_fanout = 2.00, max_fanout = 2
*
*
*
*
*
1 1gat inpt 1 0 >sa1
2 2gat inpt 1 0 >sa1
3 3gat inpt 2 0 >sa0 >sa1
8 8fan from 3gat >sa1
9 9fan from 3gat >sa1
6 6gat inpt 1 0 >sa1
7 7gat inpt 1 0 >sa1
10 10gat nand 1 2 >sa1
1 8
11 11gat nand 2 2 >sa0 >sa1
9 6
14 14fan from 11gat >sa1
15 15fan from 11gat >sa1
16 16gat nand 2 2 >sa0 >sa1
2 14
20 20fan from 16gat >sa1
21 21fan from 16gat >sa1
19 19gat nand 1 2 >sa1
15 7
22 22gat nand 0 2 >sa0 >sa1
10 20
23 23gat nand 0 2 >sa0 >sa1
21 19
这是我写的 flex 文件。
首先,这是声明文件:
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# define INPT 1
# define NOR 2
# define NAND 3
# define NOT 4
# define XOR 5
# define AND 6
# define BUFF 7
# define FROM 8
其次,这是 flex 文件:
%{
# include "declare.h"
/*gi=1,it's input;gi=7,it's fanout;otherwise,it's gate*/
int gi=-1;
int inum=0;
int val;
struct{
char *symbol;
int val;
} symtab[]={
"inpt", INPT,
"nor", NOR,
"nand", NAND,
"not", NOT,
"xor", XOR,
"and", AND,
"buff", BUFF,
"from",FROM,
"0",0
};
extern FILE *yyin;
%}
%start A B C D E
DIGITS [0-9]+
BLANK [ \t\n]+
ALPHA [a-z]+
%%
"*".*\n {ECHO; BEGIN A;}
<A>{BLANK}{DIGITS} {printf("num=%s\t",yytext); BEGIN B;}
<B>{BLANK}{DIGITS}{ALPHA} {printf("name=%s",yytext); BEGIN C;}
<C>{BLANK}{DIGITS} {printf("op=%s\t",yytext);BEGIN D;}
<C>{BLANK}{DIGITS}{ALPHA} {ECHO; BEGIN A;}
<D>{BLANK}{DIGITS} {inum=atoi(yytext);
printf("ip=%s\t",yytext);
if(gi==1)
{BEGIN A;}
if(gi!=1)
{BEGIN E;}
}
<E>{BLANK}{DIGITS} {inum--;
if(inum<0)
{printf("num=%s\t",yytext); BEGIN B;}
else
{printf("il=%s\t",yytext); BEGIN E;}
}
{ALPHA} {gi=lookup(yytext);
if(gi!=0) printf("\tty=%d\t",gi);
else ECHO;
}
{BLANK}">sa"[0-1] {val=atoi(&yytext[yyleng-1]);printf("\tfl=%d",val);}
{BLANK} ;
%%
lookup(s)
char* s;
{int i;
for (i=0;symtab[i].val!=0;i++)
{
if(strcmp(symtab[i].symbol,s)==0)
break;
}
return(symtab[i].val);
}
main()
{
FILE *x=fopen("c17.isc","r");
yyin=x;
yylex();
}
这是执行结果。我用 * 标记了错误的地方。基本上错误发生在输入列表的行。
例如,图片中第一个错行应该是“ num=10
”,第二个错行应该是“ il=1 il=8
”等。
我对 flex 文件中输入列表的操作位于 E 部分。但我不知道为什么它不起作用。
num=1 name=1gat ty=1 op=1 ip=0 fl=1
num=2 name=2gat ty=1 op=1 ip=0 fl=1
num=3 name=3gat ty=1 op=2 ip=0 fl=0 fl=1
num=8 name=8fan ty=8 3gat fl=1
num=9 name=9fan ty=8 3gat fl=1
num=6 name=6gat ty=1 op=1 ip=0 fl=1
num=7 name=7gat ty=1 op=1 ip=0 fl=1
**il=10** name=10gat ty=3 op=1 ip=2 fl=1
**num=1** il=8
**il=11** name=11gat ty=3 op=2 ip=2 fl=0 fl=1
**num=9** il=6
**num=4** ...
**num=5** ...
**il=16** ...
**num=2** il=14
**num=0** ...
**num=1** ...
**il=19** ...
**num=15** il=7
**il=22** ...
**il=23** ...