解析器生成器 CUP 中的错误输出

wrong output in parser generator CUP

我在使用 JAVA 解析器生成器 CUP 时遇到了一些问题,我不知道为什么,有人可以帮助我吗?

杯子文件在这里:

import java_cup.runtime.*;    

/* Terminals (tokens returned by the scanner). */    
terminal FCONST;    
terminal IDENTIFIER;    
terminal STRING_DEFINITION;    
terminal ASSIGN;    
terminal OPEN_SQUARE_BRACKET;    
terminal CLOSE_SQUARE_BRACKET;

/* Non-terminals */    
non terminal program;    
non terminal explicit_value;    
non terminal const_array_list_value;

/* Top level rules */    
program ::=
    FCONST IDENTIFIER ASSIGN explicit_value
    ;

explicit_value ::=
    OPEN_SQUARE_BRACKET const_array_list_value CLOSE_SQUARE_BRACKET
    |
    STRING_DEFINITION:e 
    {:
        System.out.printf("explicit_value %s \n", e);
    :}
    ;

const_array_list_value ::=
    explicit_value
    |
    const_array_list_value explicit_value
    ;

并且在解析 "const aaa = ["a", "b", "c"]" 时,输出为:

explicit_value b

explicit_valuec

explicit_valuec

我发现是 CUP 的 bug,我把我的代码改成了 bison。

%{

import java.io.*;

%}

%pure_parser

%error_verbose

%token FCONST;
%token IDENTIFIER;
%token STRING_DEFINITION;
%token ASSIGN;
%token OPEN_SQUARE_BRACKET;
%token CLOSE_SQUARE_BRACKET;
%token SPLIT;


%%

program:    FCONST IDENTIFIER ASSIGN explicit_value
       ;

explicit_value :
    OPEN_SQUARE_BRACKET const_array_list_value CLOSE_SQUARE_BRACKET
    |
    STRING_DEFINITION
    {
        System.out.printf("explicit_value %s \n", ((ParserVal)()).sval);
    }
    ;

const_array_list_value :
    explicit_value
    |
    const_array_list_value explicit_value
    ;