Почему лимон не выполняет терминалы сразу?

Я перемещаю небольшой многопоточный интерпретатор, используя flex и yacc, на re2c и лимон. Все работает, но литералы.

Почему действие, связанное с литералами, не выполняется, как с yacc? Я ожидаю "конец 1.0", но получаю "конец 0.0"

dspgrammar.y

%include {#include <assert.h>}
%name dsp
%token_type {float}
program   ::= expr.    {printf("end\n");}
expr(val) ::= LITERAL. {printf("%f ", val);}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "dspgrammar.h"

void *dspAlloc(void *(*)(size_t));
void dsp(void *, int, float);
void dspFree(void *, void (*)(void *));
void dspTrace(FILE *, char *);

int main(int argc, char *argv[])
{
        void *parser = dspAlloc(malloc);
        dspTrace(stderr, "TRACE: ");
        dsp(parser, LITERAL, 1.0f);
        dsp(parser,       0, 0.0f);
        dspFree(parser, free);
        return EXIT_SUCCESS;
}

Makefile

CC      = gcc
CFLAGS  = -O0 -g -Wall -Wextra -pedantic -std=gnu99
LD      = gcc
LDFLAGS = -lm

dsp: main.o dspgrammar.o
        $(LD) $(CFLAGS) -o $@ $^ $(LDFLAGS)

main.o: main.c
        $(CC) $(CFLAGS) -c main.c

dspgrammar.o: dspgrammar.c
        $(CC) -c $(CFLAGS) -c dspgrammar.c

dspgrammar.c: dspgrammar.y
        lemon dspgrammar.y

person LogicG8    schedule 01.09.2015    source источник


Ответы (1)


In

expr(val) ::= LITERAL. { /* something with val */ }

val — имя значения сокращения. Другими словами, это соответствует $$ в yacc. Семантическое значение терминала LITERAL равно $1, поскольку вы не указали символическое имя для этого значения.

Возможно, вы имели в виду:

expr ::= LITERAL(val). { /* something with val */ }

Or

expr(e) ::= LITERAL(v). { e = v; /* some other action */ }
person rici    schedule 01.09.2015