Разбор SableCC дал неверный результат
Я попытался разобрать правильное сообщение, используя sablecc. Существует три типа допустимого формата сообщения.
- ааа; (три непрерывных буквенных символа + полу
{messageid} messageid semi
) - мм; (или два непрерывных буквенных или цифровых символа
{flightnum} carriercode semi
) - -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 ;