2014-02-27 59 views
0

列表区分我想打一个语法解析包含空格分隔的浮点值和字符串value.It是保证最后一个值将是浮法线,它可能是在大括号包裹{}如何最后浮点值浮法

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

还有许多事情要分析几个例子:

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个字符串作为usuall,并将最后一个字符串句柄单独处理。你也可以先读1个值,如果没有,则它是行... – Spektre

回答

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'警告,因为'items'和'value'是相同类型和解析器将能区分它们 – EmptyData

+0

'items'是一个列表,'value'是一个元素。 – Josh