Разбор SableCC дал неверный результат

Я попытался разобрать правильное сообщение, используя sablecc. Существует три типа допустимого формата сообщения.

  1. ааа; (три непрерывных буквенных символа + полу {messageid} messageid semi)
  2. мм; (или два непрерывных буквенных или цифровых символа {flightnum} carriercode semi)
  3. -amm (или дефис + буквенный символ + 2 непрерывных буквенных или цифровых символа {load} hypene co semi)

когда я вводил правильную строку в программу, она не работала.

вход:

а; //Тип 1

ZZ; // тип 2

ZZ; // тип 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, код оператора, '-'

Хотя первая строка действительна.

1 ответ

Эта ошибка вызвана перекрывающимся определением токена. Sablecc работает снизу вверх, а не в виде последовательности. Это код для решения проблемы. Спасибо, Этьен, за решение проблемы.

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 ;
Другие вопросы по тегам