2

我正在使用LEMON Parser Generator,由于某种原因,它在输出文件的末尾输出了一堆垃圾,而不是用%%生成的代码替换 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 }

这是它只是附加到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("Stackoverflow.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"
4

1 回答 1

2

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

读取模板的函数不会做很多错误检查。它只是读取直到到达 EOF 或找到以两个百分号开头的行:

while( fgets(line,LINESIZE,in) && (line[0]!='%' || line[1]!='%') ){
  // ...
}

因此,如果少于 15 个部分,则只会将缺少的部分设为空。

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

对于它的价值,我认为使用 IDE 下载源文件没有任何实际价值。在柠檬起始页上,有指向lemon.clempar.c的链接;这些页面中的每一个都有一个下载链接(在顶部附近的浅蓝色条中)。在大多数浏览器中,您只需右键单击链接并选择“另存为...”即可下载文件。或者您可以复制链接地址并使用curl(我就是这样做的)或wget. (我没有在此处放置可下载文件的链接,因为该链接是版本化的,您可能希望使用最新版本。)

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

于 2017-06-20T04:24:00.043 回答