Проблемы с разбором ‘новой строки’ в Ragel

Я использую Ragel и C ++ в качестве хоста для разбора нескольких команд. Команды читаются из файла, а затем анализируются с использованием следующего синтаксиса.

Синтаксис команды следующий:

Signal_representation {
[<signal_encoding_type_name>: <signal_name> ([, <signal_name>]) ;]
}

Теперь здесь в приведенном выше синтаксисе может быть NEWLINE после : или после имени сигнала и запятой ,

example:

#1  Signal_representation{
#2      Activity:
#3        Button_Active,
#4        Buttons_Inactive;
#5      Switch:
#6        Horn,
#7        Up_Arrow,
#8        Right_Arrow,
#9        Down_Arrow,
#10       Audio,
#11       Day_Night, Sleep, SWM_Off;
#12  }

Вот грамматика Рагеля, которой я следую для анализа приведенных выше команд.

action string_error {
cout << " ERROR::Expected string characters at line = "<< g_ReadLineNbr << endl;
}

action incr_Count {
//increment count to trace back and retrieve the string encountered
iGenrlCount++;
}

action getString {
std::stringstream str;
while(iGenrlCount > 0)
{
str << *(p - iGenrlCount);
iGenrlCount--;
}
str >> GeneralStr; //push the values
}

action getSglEncTyp {
cout << "Enc type = " << GeneralStr<< endl;
GeneralStr.clear();
}

action getSgnlName {
cout << "Signal name = " << GeneralStr<< endl;
GeneralStr.clear();
}

action getSgnlRepr {
cout << "parse ok" << endl;
}

action parse_error {
cout << "parse failed" << endl;
}

// my definition of Ragel grammar

OPEN_BRACES = '{';
BARE_STRING = ([a-zA-Z0-9_\.\-]+) $incr_Count %getString >!(string_error);
CLOSE_BRACES = '}';

//parsing starts from the  parameter <signal_encoding_type_name>

signal_repr =  (space* BARE_STRING%getSglEncTyp space* ':' space* BARE_STRING%getSgnlName (space* ',' space* BARE_STRING%getSgnlName)* space* ';' space*)%/getSgnlRepr $!parse_error;

main := signal_repr | space* ;//global variables in C++ prgram visible across all actions
string GeneralStr;
int iGenrlCount = 0;

Проблема, с которой я сталкиваюсь, связана с новой строкой в ​​файле. Для приведенного выше примера я получаю следующую ошибку
ERROR::Expected string characters at line = 2

Согласно документу Ragel 6.10 FSM space должен обнаружить следующее

Whitespace. [\t\v\f\n\r ]

Я также попытался заменить пробел следующим FSM:

_CR = ('\r' | '\n' | '\r\n' );

но даже вышеперечисленное не работает.

Кто-нибудь сталкивался с подобной ситуацией? Я вижу некоторые вопросы по Stackoverflow, касающиеся Ragel и новой строки, но, похоже, здесь не рассматривается проблема именно здесь.

0

Решение

Вы должны разделить логику на две части вместо одной.

например. не испытано

signal_repr_single_line = (space* BARE_STRING%getSglEncTyp space* ':' space* BARE_STRING%getSgnlName (space* ',' space* BARE_STRING%getSgnlName)* space* ';' space*)%/getSgnlRepr $!parse_error;
signal_repr_multi_line = (space* BARE_STRING%getSglEncTyp space* ':' (space* BARE_STRING%getSgnlName(space* ','{1} space*)));

signal_repr = signal_repr_single_line | signal_repr_multi_line;
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]