如何区分float列表中的last float值

时间:2014-02-27 10:54:01

标签: c++ bison yacc

我想创建一个语法来解析一个包含空格分隔的浮点值和字符串值的行。它保证Last值是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;
}

如果最后一个值有大括号,它是否有效但如果最后一个值中没有括号,我该如何区分值。 它还提供减少/减少错误

1 个答案:

答案 0 :(得分: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         { ... }
    ;