编辑:下面是接受的解决方案。
我正在研究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的引用。类似地,stdinfscanf读取,FILE *从不同的读取

10-06 10:18