Lemon接受lempar.c并在文件末尾输出垃圾

Lemon接受lempar.c并在文件末尾输出垃圾,c,parsing,generator,lemon,C,Parsing,Generator,Lemon,由于某种原因,我使用了,它在输出文件的末尾输出了一堆垃圾,而不是用生成的代码替换lempar.c中的%%s。我直接从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_o

由于某种原因,我使用了,它在输出文件的末尾输出了一堆垃圾,而不是用生成的代码替换lempar.c中的
%%
s。我直接从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("Stackoverflow.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 }

Lemon希望模板文件
lempar.c
正好有15个部分,以行start
%%
分隔。(数字15可能会发生变化。)在这些部分之间,它穿插了从语法描述生成的代码

读取模板的函数不会执行很多错误检查。它只是读取,直到碰到EOF或找到以2%符号开头的行:

while( fgets(line,LINESIZE,in) && (line[0]!='%' || line[1]!='%') ){
  // ...
}
因此,如果少于15个部分,只需将缺少的部分清空即可

事实证明,您的IDE重新嵌入了下载的文件,包括许多恰好落在括号内的
%%
分隔行。因此,大多数生成的文本被插入到错误的位置,并且许多
%%
行被保留,它们将触发语法错误

不管它值多少钱,我认为使用IDE下载源文件没有任何实际价值。在网站上有到和的链接;每个页面都有一个下载链接(在顶部附近的浅蓝色条中)。在大多数浏览器中,只需右键单击链接并选择“另存为…”即可下载文件。或者,您可以复制链接地址并使用
curl
(我就是这么做的)或
wget
下载它。(我没有在此处放置指向可下载文件的链接,因为该链接已进行版本控制,您可能希望使用最新版本。)


然后您只需要编译
lemon.c
c99-Wall-O2-o lemon-lemon.c
)并将
lempar.c
的副本放在运行lemon的目录中。(或者您可以使用
-T
选项指定
lempar.c
的位置。)

无法复制。也许你有一个堕落的lempar。c@rici我希望是这样,但我尝试过不同的版本,包括从web界面复制/粘贴、直接从sqlite源代码压缩包复制,甚至使用lemon从另一个项目复制。如果有任何明显的问题,下面是我正在使用的一个(来自sqlite源代码):我只是使用lemon页面的下载链接抓取了这两个文件,编译了lemon,然后运行
/lemon file.y
。没有明显的问题。(我首先用我安装的版本进行了验证。)所以我复制了抓取文件的过程,但是在bash+vim内部,而不是使用Clion。Clion IDE必须对lempar文件做一些混乱的操作才能将其搞乱。问题似乎是Clion对粘贴的C代码的自动重新格式化删除了对LEMON很重要的缩进@因为你花了时间,如果你想回答说文件被程序破坏了,我会接受的。
while( fgets(line,LINESIZE,in) && (line[0]!='%' || line[1]!='%') ){
  // ...
}