Попытка сопоставить правило, которое использует «рекурсивный» идентификатор в flex - PullRequest
0 голосов
/ 11 января 2012

У меня есть эта строка:

0, 6 -> W(1) L(#);

или

\# -> @shift_right R W(1) L

Я должен проанализировать эту строку с помощью flex, взять каждый элемент из каждой части стрелки и поместить его всписок.Я знаю, как сопоставлять простые вещи, но я не знаю, как сопоставить несколько вещей с одним и тем же правилом.Мне не разрешено увеличивать лимит для правил.У меня есть подсказка: разобрать кусочки, затем соединить кусочки, и я могу использовать состояния, но я не знаю, как это сделать, и я не могу найти примеры в сети.Кто-нибудь может мне помочь?

Итак, вот пример:

{

a -> W (b) #invert_loop;

b -> W(a) #invert_loop;

-> L (#)

}

Когда начинается этот раздел, мне нужно создать структуру для каждой строки, куда я помещаю то, чтоСлева от -> в векторе - это некоторые параметры, а справа - список, где каждый член является своего рода другой структурой.Для того, что справа, я написал правила:

writex W ([a-zA-Z0-9. #]) Для W (что угодно).

Так что мне нужно разобрать этилинии, так что я могу поместить параметры и структуры в большую структуру.Примерно так (для первой строки):

new bigStruc с param = a и списком struct = W (что угодно), #invert (это запись для ссылки на другую структуру)

Итак, мне нужно знать, как анализировать эти строки, чтобы я мог создавать, создавать и заполнять эти bigStruct, также используя правила для простой структуры (у меня есть все, что мне нужно для этих структур, но я не знаю, каканализирую, чтобы я мог использовать эти методы).

Извините за мой английский, и я надеюсь, что на этот раз я был более ясен в том, что я хочу.строка с правилом, а затем работать над ним с помощью strtok.Есть способ использовать предыдущие правила, чтобы увидеть, какой тип структуры я должен создать?Я имею в виду не остаться и поставить много, если, но использовать writex W ([a-zA-Z0-9. #]), Чтобы знать, что я должен создать такую ​​структуру?

1 Ответ

0 голосов
/ 11 января 2012

Хорошо, давайте посмотрим, как этот фрагмент работает для вас:

// these are exclusive rules, so they do not overlap, for inclusive rules, use %s
%x dataStructure
%x addRules
%%
<dataStructure>-> { BEGIN addRules; }
\{                { BEGIN dataStructure; }
<addRules>;       { BEGIN dataStructure; }
<dataStructure>\} { BEGIN INITIAL; }

<dataStructure>[^,]+ { ECHO; } //this will output each comma separated token
<dataStructure>. { } //ignore anything else
<dataStructure>\n { } //ignore anything else
<addRules>[^ ]+ { ECHO; } //this will output each space separated rule
<addRules>. { } //ignore anything else
<addRules>\n { } //ignore anything else
%%

Я не совсем уверен, что именно вы хотите.Отредактируйте исходное сообщение, включив в него содержание ваших комментариев с примерами, и, пожалуйста, лучше структурируйте свой английский.Если вы не можете объяснить, что вы хотите, не противореча себе, я не могу вам помочь.

...