2
我想用檸檬和蘋果核心基金會編寫一個簡單的JSON解析器。使用檸檬(和核心基金會)解析JSON
這裏是到目前爲止的代碼:
%include {
#import <CoreFoundation/CoreFoundation.h>
#import "state.h" // struct ParserState { CFTypeRef result; };
#import "tuple.h" // struct Tuple { CFTypeRef one; CFTypeRef two; };
}
%start_symbol json
%token_type { CFTypeRef }
%token_prefix T
%extra_argument { ParserStateRef state }
%type simple_value { CFTypeRef }
%type member { TupleRef }
%type members { CFMutableDictionaryRef }
%type object { CFMutableDictionaryRef }
%type array { CFMutableArrayRef }
simple_value(A) ::= STRING(B). { A = B; }
simple_value(A) ::= INT(B). { A = B; }
simple_value(A) ::= FLOAT(B). { A = B; }
simple_value(A) ::= FALSE. { A = kCFBooleanFalse; }
simple_value(A) ::= TRUE. { A = kCFBooleanTrue; }
simple_value(A) ::= NULL. { A = kCFNull; }
member(A) ::= STRING(B) COLON simple_value(C). {
A = TupleCreate(B,C);
}
member ::= STRING COLON object.
member ::= STRING COLON array.
members(A) ::= member(B). {
A = CFDictionaryCreateMutable(kCFAllocatorDefault,0,&kCFTypeDictionaryKeyCallBacks,&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(A, B->first, B->second);
CFRelease(B->first);
CFRelease(B->second);
TupleRelease(B);
}
members(A) ::= members(B) COMMA member(C). {
CFDictionarySetValue(B, C->first, C->second);
CFRelease(C->first);
CFRelease(C->second);
TupleRelease(C);
A = B;
}
values ::= value.
values ::= values COMMA value.
object(A) ::= LCB RCB. {
/* THIS NEVER GETS CALLED */
A = CFDictionaryCreateMutable(kCFAllocatorDefault,0,&kCFTypeDictionaryKeyCallBacks,&kCFTypeDictionaryValueCallBacks);
}
object(A) ::= LCB members(B) RCB. {
/* THIS NEVER GETS CALLED */
A = B;
}
array ::= LSB RSB.
array ::= LSB values RSB.
value ::= array.
value ::= object.
value ::= simple_value.
json ::= object(A). { state->result = A; }
json ::= array.
用一個簡單的JSON這樣
{ \"hello\" : \"world\" }
我不能走過去的成員規則(在這一點上,詞典設置正確地)。
對象規則永遠不會被調用,並且json :: = object也是這樣做的!
我在做一些愚蠢的事情嗎?
任何輸入將不勝感激!