c++ - 如何区分浮点列表中的最后一个浮点值

标签 c++ bison yacc

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

关于c++ - 如何区分浮点列表中的最后一个浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22066331/

相关文章:

c - 警告 : 2 reduce/reduce conflicts [-Wconflicts-rr] in yacc grammar

c++ - SendInput 始终将鼠标指针移动到左上角

c++ - 模板类多重定义

parsing - 如何检测 Jison 中的新行?

parsing - 从生成的解析表中检索语法规则

parsing - yacc/byacc/bison 和 lex/flex 的适当用途

c++ - 在 vector 中找到 n 个最大值

c++ - 无法将 CLion 链接到 Windows 10 上的 QT

bison - yylex 的多重定义

c++ - 弹性和 Bison : g++ compiling error