编辑:下面是接受的解决方案。
我正在研究Bison mfcalc示例:
https://www.gnu.org/software/bison/manual/bison.html#Mfcalc-Main
我希望能够读取文件,而不是stdin。我已经启动并运行了他们的示例,但是因为他们重新定义了yylex(),所以让解析器从文件中读取并不像通常那样简单。
任何能帮忙的人都将不胜感激!
附言。像这样的:http://beej.us/guide/bgc/output/html/multipage/getc.html
但我对C不太在行。我会在这段时间内尝试实现它。
所以你需要修改一下:
int
yylex (void)
{
int c;
/* Ignore white space, get first nonwhite character. */
while ((c = getchar ()) == ' ' || c == '\t')
continue;
if (c == EOF)
return 0;
/* Char starts a number => parse the number. */
if (c == '.' || isdigit (c))
{
ungetc (c, stdin);
scanf ("%d", &yylval.NUM);
return NUM;
}
/* Char starts an identifier => read the name. */
if (isalpha (c))
{
/* Initially make the buffer long enough
for a 40-character symbol name. */
static size_t length = 40;
static char *symbuf = 0;
symrec *s;
int i;
if (!symbuf)
symbuf = (char *) malloc (length + 1);
i = 0;
do
{
/* If buffer is full, make it bigger. */
if (i == length)
{
length *= 2;
symbuf = (char *) realloc (symbuf, length + 1);
}
/* Add this character to the buffer. */
symbuf[i++] = c;
/* Get another character. */
c = getchar ();
}
while (isalnum (c));
ungetc (c, stdin);
symbuf[i] = '\0';
s = getsym (symbuf);
if (s == 0)
s = putsym (symbuf, VAR);
*((symrec**) &yylval) = s;
return s->type;
}
/* Any other character is a token by itself. */
return c;
}
最佳答案
这与野牛无关。
在Cgetchar
中,从stdin
读取。如果要使用不同的FILE *
,请改用getc
。因此,请检查上面的yylex代码,并用getchar()
替换getc(yyin)
(或者用FILE *
的名称替换stdin
),并用yyin
替换所有其他对scanf
的引用。类似地,stdin
从fscanf
读取,FILE *
从不同的读取