Lemon 使用 lempar.c 并在文件末尾输出垃圾
Lemon takes lempar.c and outputs garbage at end of file
我正在使用 LEMON Parser Generator,出于某种原因,它在输出文件的末尾输出了一堆垃圾,而不是将 lempar.c 中的 %%
替换为生成的代码。我直接从 sqlite 源代码复制了 lemon.c 和 lempar.c。这是我的语法文件:
%token_prefix TK_
%token_type {const char*}
%extra_argument { HiqupElem elem }
%syntax_error {
printf("Hit syntax error, not sure..\n");
}
%stack_overflow {
printf("whosebug.com\n");
}
%name hiqupParser
%include {
#include <stdio.h>
#include <assert.h>
#include "types.h"
}
%start_symbol start
start ::= in .
in(A) ::= in expression(B) SEMICOLON . { printf("Found expression %s, %s!\n", A, B); }
expression(A) ::= STRING(B) . { A = B }
expression(A) ::= NUMBER(B) . { A = B }
这是它只是附加到 lempar 文件副本末尾的垃圾
"$", "SEMICOLON", "STRING", "NUMBER",
"error", "start", "in", "expression",
/* 0 */ "in ::= in expression SEMICOLON",
/* 1 */ "expression ::= STRING",
/* 2 */ "expression ::= NUMBER",
/* 3 */ "start ::= in",
#line 9 "compiler.y"
printf("whosebug.com\n");
#line 1025 "compiler.c"
{ 6, 3 },
{ 7, 1 },
{ 7, 1 },
{ 5, 1 },
YYMINORTYPE yylhsminor;
case 0: /* in ::= in expression SEMICOLON */
#line 25 "compiler.y"
{ printf("Found expression %s, %s!\n", yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); }
#line 1034 "compiler.c"
break;
case 1: /* expression ::= STRING */
case 2: /* expression ::= NUMBER */ yytestcase(yyruleno==2);
#line 27 "compiler.y"
{ yylhsminor.yy0 = yymsp[0].minor.yy0 }
#line 1040 "compiler.c"
yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
default:
/* (3) start ::= in */ yytestcase(yyruleno==3);
break;
#line 5 "compiler.y"
printf("Hit syntax error, not sure..\n");
#line 1049 "compiler.c"
Lemon 期望模板文件 lempar.c
恰好有 15 个部分,以行 %%
分隔。 (数字 15 可能会发生变化。)在这些部分之间,它穿插了根据语法描述生成的代码。
读取模板的函数没有做很多错误检查。它只是简单地读取直到遇到 EOF 或找到以两个百分号开头的行:
while( fgets(line,LINESIZE,in) && (line[0]!='%' || line[1]!='%') ){
// ...
}
因此,如果少于15个部分,则将缺少的部分留空。
事实证明,您的 IDE 重新缩进了下载的文件,包括许多 %%
分隔线,它们恰好落在方括号内。因此,大部分生成的文本都被插入到错误的位置,许多 %%
行被保留,它们将在此处触发语法错误。
就其价值而言,我认为使用 IDE 下载源文件没有任何实际价值。上 lemon starting page there are links to lemon.c and lempar.c;每个页面都有一个下载 link(在顶部附近的浅蓝色条中)。在大多数浏览器中,您只需右键单击 link 并选择 "Save as..." 即可下载该文件。或者您可以复制 link 地址并使用 curl
(我就是这样做的)或 wget
下载它。 (我没有在此处的可下载文件中添加 link,因为 link 已进行版本控制,您可能希望使用最新版本。)
那么你只需要编译lemon.c
(c99 -Wall -O2 -o lemon lemon.c
) 并在你运行 柠檬的目录中复制一份lempar.c
。 (或者您可以使用 -T
选项指定 lempar.c
的位置。)
我正在使用 LEMON Parser Generator,出于某种原因,它在输出文件的末尾输出了一堆垃圾,而不是将 lempar.c 中的 %%
替换为生成的代码。我直接从 sqlite 源代码复制了 lemon.c 和 lempar.c。这是我的语法文件:
%token_prefix TK_
%token_type {const char*}
%extra_argument { HiqupElem elem }
%syntax_error {
printf("Hit syntax error, not sure..\n");
}
%stack_overflow {
printf("whosebug.com\n");
}
%name hiqupParser
%include {
#include <stdio.h>
#include <assert.h>
#include "types.h"
}
%start_symbol start
start ::= in .
in(A) ::= in expression(B) SEMICOLON . { printf("Found expression %s, %s!\n", A, B); }
expression(A) ::= STRING(B) . { A = B }
expression(A) ::= NUMBER(B) . { A = B }
这是它只是附加到 lempar 文件副本末尾的垃圾
"$", "SEMICOLON", "STRING", "NUMBER",
"error", "start", "in", "expression",
/* 0 */ "in ::= in expression SEMICOLON",
/* 1 */ "expression ::= STRING",
/* 2 */ "expression ::= NUMBER",
/* 3 */ "start ::= in",
#line 9 "compiler.y"
printf("whosebug.com\n");
#line 1025 "compiler.c"
{ 6, 3 },
{ 7, 1 },
{ 7, 1 },
{ 5, 1 },
YYMINORTYPE yylhsminor;
case 0: /* in ::= in expression SEMICOLON */
#line 25 "compiler.y"
{ printf("Found expression %s, %s!\n", yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); }
#line 1034 "compiler.c"
break;
case 1: /* expression ::= STRING */
case 2: /* expression ::= NUMBER */ yytestcase(yyruleno==2);
#line 27 "compiler.y"
{ yylhsminor.yy0 = yymsp[0].minor.yy0 }
#line 1040 "compiler.c"
yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
default:
/* (3) start ::= in */ yytestcase(yyruleno==3);
break;
#line 5 "compiler.y"
printf("Hit syntax error, not sure..\n");
#line 1049 "compiler.c"
Lemon 期望模板文件 lempar.c
恰好有 15 个部分,以行 %%
分隔。 (数字 15 可能会发生变化。)在这些部分之间,它穿插了根据语法描述生成的代码。
读取模板的函数没有做很多错误检查。它只是简单地读取直到遇到 EOF 或找到以两个百分号开头的行:
while( fgets(line,LINESIZE,in) && (line[0]!='%' || line[1]!='%') ){
// ...
}
因此,如果少于15个部分,则将缺少的部分留空。
事实证明,您的 IDE 重新缩进了下载的文件,包括许多 %%
分隔线,它们恰好落在方括号内。因此,大部分生成的文本都被插入到错误的位置,许多 %%
行被保留,它们将在此处触发语法错误。
就其价值而言,我认为使用 IDE 下载源文件没有任何实际价值。上 lemon starting page there are links to lemon.c and lempar.c;每个页面都有一个下载 link(在顶部附近的浅蓝色条中)。在大多数浏览器中,您只需右键单击 link 并选择 "Save as..." 即可下载该文件。或者您可以复制 link 地址并使用 curl
(我就是这样做的)或 wget
下载它。 (我没有在此处的可下载文件中添加 link,因为 link 已进行版本控制,您可能希望使用最新版本。)
那么你只需要编译lemon.c
(c99 -Wall -O2 -o lemon lemon.c
) 并在你运行 柠檬的目录中复制一份lempar.c
。 (或者您可以使用 -T
选项指定 lempar.c
的位置。)