编辑:下面接受的解决方案。
我在这里处理 Bison mfcalc 示例: https://www.gnu.org/software/bison/manual/bison.html#Mfcalc-Main
我希望能够从文件而不是标准输入中读取。我已经启动并运行了他们的示例,但是因为他们已经重新定义了 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;
}
这与 Bison 无关。
在 C 中,getchar
从 stdin
中读取。如果您想使用不同的 FILE *
,请改用 getc
。因此,检查上面的 yylex 代码并将 getchar()
替换为 getc(yyin)
(或任何 FILE *
的名称) ),并将所有其他对 stdin
的引用替换为 yyin
。同样,scanf
从 stdin
读取,而 fscanf
从不同的 FILE *
读取
我是一名优秀的程序员,十分优秀!