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个值,如果没有,则为行尾…但这将导致
减少/减少警告,因为项
和值
是相同的类型,解析器将能够区分它们项
是一个列表,值
是一个元素。