Я хочу, чтобы грамматика анализировала строку, содержащую значения float, разделенные пробелами и строковое значение. Гарантируется, что последнее значение будет плавающим и может быть завершено в фигурные скобки {}
В основном я хочу сохранить все значения, кроме последнего значения, в списке значений строки и последнего значения float в отдельной переменной.
Есть несколько примеров, которые я хочу проанализировать:
example 1:
12 13 14
example 2
12 a b 15
example 3
12 13 14 {14}
Я сделал грамматику следующим образом:
list
:FloatStringList value
{
StoreList($1);
StoreLastValue($2);
}
FloatStringList
:FloatStringList FloatString
{
$1->push_back($2);
$$=$1;
}
|FloatString
{
$$=new ListOfString();
$$->push_back($1);
}
;
FloatString
:STRING
{
$$=$1;
}
|FLOAT
{
$$ = ConvertFloatToSring($1);
};
value
:FLOAT
{
$$ = $1;
}
Он работает, если последнее значение имеет фигурные скобки, но как я могу различать значения, если в последнем значении нет скобки. Он также дает ошибку уменьшения/уменьшения
Вы правы, вам понадобится рекурсия. Просто рассматривайте последнее значение списка как свой собственный отдельный тип. Вот пример, к которому вы стремитесь:
list: items lastValue {$1->pushBack($2);}
;
items: items value {$1->pushBack($2);}
| value {$$ = new List(); $$->pushBack($1);}
| /* empty */ {$$ = new List();}
;
lastValue: '{' float '}' { $$ = parseFloat($2); }
| float { $$ = parseFloat($1); }
;
value: float { ... }
| string { ... }
;
reduce/reduce
предупреждений, потому что items
и value
имеют одинаковый тип, и анализатор сможет различать их.
items
- это список, а value
- элемент.