SableCC解析给出了错误的结果

时间:2015-07-21 04:12:45

标签: java regex parsing sablecc

我尝试使用sablecc解析有效消息。有三种类型的有效消息格式。

  1. AAA; (三个连续的字母+半{messageid} messageid semi
  2. 毫米; (或两个连续的字母或数字字符{flightnum} carriercode semi
  3. -amm(或连字符+字母+ 2个连续的字母或数字字符{load} hypene co semi
  4. 当我向程序输入有效字符串时,它不起作用。

    输入:

      

    ABC; //输入1

         

    ZZ; //输入2

         

    ZZ; //输入2

         

    -Ab2共; // TYPE3

    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,   运营商代码,' - '

    即使第一个字符串有效。

1 个答案:

答案 0 :(得分: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 ;