C++ 如何区分浮动列表中的最后一个浮动值

C++ 如何区分浮动列表中的最后一个浮动值,c++,bison,yacc,C++,Bison,Yacc,我想制作一个语法来解析包含空格分隔的浮点值和字符串值的行。可以保证最后一个值是浮点值,并且可以用大括号括起来{} 基本上,我想将所有值存储在字符串列表中,除了最后一个值和单独变量中的最后一个浮点值 我想分析的示例很少: example 1: 12 13 14 example 2 12 a b 15 example 3 12 13 14 {14} 我的语法是这样的: list :FloatStringList value { StoreList($1); StoreLastV

我想制作一个语法来解析包含空格分隔的浮点值和字符串值的行。可以保证最后一个值是浮点值,并且可以用大括号括起来
{}

基本上,我想将所有值存储在字符串列表中,除了最后一个值和单独变量中的最后一个浮点值

我想分析的示例很少:

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;
}
如果最后一个值有大括号,它就可以工作,但如果最后一个值中没有大括号,我如何区分这些值呢。
它还提供了reduce/reduce error

如果您是对的,您将需要递归。只需将列表的最后一个值视为它自己的独特类型即可。这是一个大致符合您目标的示例:

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         { ... }
    ;

将整行作为字符串读取,计算字符串->n,然后将n-1个字符串作为usuall处理,最后一个字符串单独处理。您还可以提前读取1个值,如果没有,则为行尾…但这将导致
减少/减少
警告,因为
是相同的类型,解析器将能够区分它们
是一个列表,
是一个元素。