2015-07-21 91 views
0

我試圖使用sablecc解析有效的消息。有三種有效的消息格式。SableCC解析給出錯誤結果

  1. aaa; (三個連續字符+半角{messageid} messageid semi
  2. mm; (或兩個連續字母或數字字符{flightnum} carriercode semi
  3. -amm(或連字符+字母字符+ 2個連續字母或數字字符{load} hypene co semi

當我輸入有效的字符串到程序,它不工作。

輸入:

ABC; // type 1

ZZ; // type 2

ZZ; // type 2

-ab2; // 3型

sablecc文法代碼:

Helpers 
    /* Our helpers */ 
    fa = ['0' .. '9'] ; 
    a = [['a' .. 'z'] + ['A' .. 'Z']] ; 
    m= [a + fa]; 
    sp = ' ' ; 
    cr = 13 ; // carriage return 
    lf = 10 ; // line feed 
    tab = 9 ; // tab char 
    bl = sp | cr | lf | tab; 


Tokens 
    /* Our simple token definition(s). */ 
    semi = ';' bl*; 
    co = (a)(m)(m); 
    messageid = (a)(a)(a) ; 
    carriercode = (m)(m); 
    hypene ='-'; 

Productions 
    program = {single} statement | 
       {sequence} program statement; 
    statement = {messageid} messageid semi | 
       {flightnum}carriercode semi | 
       {load} hypene co semi ; 

編譯成功,當運行Java代碼,它拋出解析器異常:

simpleAdders.parser.ParserException:[1,1]期待:messageid, carriercode,' - '

即使第一st環是有效的。

回答

0

此錯誤是由重疊的標記定義引起的。 Sablecc工作在自下而上的樹結構中,而不是一種序列方式。這是解決問題的代碼。感謝Etienne爲了解決問題。

Helpers 
    /* Our helpers */ 

    sp = ' ' ; 
    cr = 13 ; // carriage return 
    lf = 10 ; // line feed 
    tab = 9 ; // tab char 
    bl = sp | cr | lf | tab; 


Tokens 
    /* Our simple token definition(s). */ 

    fa = ['0' .. '9'] ; 
    a = [['a' .. 'z'] + ['A' .. 'Z']] ; 
    semi = ';' bl*; 
    hypene ='-'; 

Productions 
    program = {single} statement | 
       {sequence} program statement; 
    m = {a} a | {fa} fa ;    
    co = hypene a [m1]:m [m2]:m semi; 
    messageid = [a1]:a [a2]:a [a3]:a semi ; 
    carriercode =[m1]:m [m2]:m semi;    
    statement = {messageid} messageid| 
       {flightnum}carriercode | 
       {load} co ;