Как отличить последнее значение с плавающей точкой в списке с плавающей точкой

0

Я хочу, чтобы грамматика анализировала строку, содержащую значения 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;
}

Он работает, если последнее значение имеет фигурные скобки, но как я могу различать значения, если в последнем значении нет скобки. Он также дает ошибку уменьшения/уменьшения

  • 0
    читать всю строку как строки, считать строки -> n, а затем обрабатывать n-1 строки как обычно, а последняя строка обрабатывается отдельно. Также вы можете прочитать вперед 1 значение, и если его нет, то это конец строки ...
Теги:
bison
yacc

1 ответ

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         { ... }
    ;
  • 0
    Но это приведет к reduce/reduce предупреждений, потому что items и value имеют одинаковый тип, и анализатор сможет различать их.
  • 0
    items - это список, а value - элемент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню