2017-06-27 15 views
0

私は、JavaパーサジェネレータCUPを使用するといくつかの問題があります。なぜ、誰かが助けてくれるのか分かりません。ここでパーサジェネレータ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_value

C explicit_valueのC

答えて

0

私はそれがCUPのバグだと私は私のコードをバイソンに変更見つける。

%{ 

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)($1)).sval); 
    } 
    ; 

const_array_list_value : 
    explicit_value 
    | 
    const_array_list_value explicit_value 
    ; 
+1

バグの説明や証拠はありますか?また、私はこれがあなた自身の質問であることを知っていますが、バイソンで解決することはカップで解決しません。 –

+0

私はそれがカップのバグだとは分かりませんが、バイソンを使うと正しい出力が得られ、文法はカップのように同じです – esrrhs