青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    Vczh Library++3.0的ManagedX(山寨C#)語法分析器寫好了。將近1000行的語法樹聲明,使用了ParserCombinator還有93k的語法分析器。寫了好久。其中遇到了一些問題,譬如說C#的語法實在太復雜,parse一個method也好property也好都會有一大堆東西。舉個例子,一個method的文法如下:
1 (attributeInfo + opt(genericInfo) + accessor + memberType + inheritation + internalExternal +
2                                             type + 
3                                             opt(type << COLON(NeedColon) << COLON(NeedColon)) + ID(NeedId) +
4                                             (OPEN_EXP_BRACE(NeedOpenExpBrace) >> plist(opt(parameter + *(COMMA >> parameter))) << CLOSE_EXP_BRACE(NeedCloseExpBrace)) +
5                                             statement
6                                           )[ToMethodMember]
7 

    最頂級的operator+一共有10個,也就是說這個東西的返回結果是pair<pair<pair<pair<pair<pair<pair<pair<pair<pair<a, b>, c>, d>, e>, f>, g>, f>, i>, j>, k>。因此ToMethodMember函數的參數也是這個類型。這顯然很令人討厭。

    再舉一個例子,property的文法如下:
1 (attributeInfo + accessor + memberType + inheritation + type + opt(type << COLON(NeedColon) << COLON(NeedColon)) + ID(NeedId) + 
2                                             (OPEN_DECL_BRACE(NeedOpenDeclBrace) >> (
3                                                 opt(GET >> statement) +
4                                                 opt(opt(setterAccessor) + (SET >> statement))
5                                             ) << CLOSE_DECL_BRACE(NeedCloseDeclBrace))
6                                           )[ToPropertyMember]
7 

    這個東西的返回結果是pair<pair<pair<pair<pair<a, b>, c>, d>, e>, pair<list<f>, list<list<pair<g, h>>>>。寫起來也很令人發瘋。因此這幾天就想了一種方法來解決這種問題。

    首先,我們一定要采取一種方法來讓這種火箭一樣的代碼給平坦化。由于operator+的左結合特性,實際上我們無法去掉這些pair,因此只能換一種方法,譬如說讓pair<pair<pair<a, b>, c>, d>總是等價于tuple<a, b, c, d>。這顯然是可能的,只需要重載足夠數量的tuple類型,就可以讓typename tuple<a, b, c, d>::ResultType等于pair<pair<pair<a, b>, c>, d>。

    其次,當我們面對這些pair<pair<pair<a, b>, c>, d>的時候,如何將他賦值到一個struct呢?假設struct的聲明如下:
1 struct s
2 {
3   a _a;
4   b _b;
5   c _c;
6   d _d;
7 };

    我們可以用下面的代碼:
1 struct s;
2 
3 auto x = ref(s._a)
4     .ref(s._b)
5     .ref(s._c)
6     .ref(s._d)
7     ;

    來讓x等于pair<pair<pair<*a, *b>, *c>, *d>。因為“點”也是左結合的。后面只需要再用模板元編程就可以把pair<pair<pair<a, b>, c>, d>賦值給pair<pair<pair<*a, *b>, *c>, *d>了。

    讓我們看看Vczh Library++3.0源代碼(Library\Scripting\Languages\ManagedX\ManagedXParser_Declaration.cpp)在使用了這個構造之前和之后的代碼。首先是直接使用和讀取pair的:
 1 Ptr<ManagedMember> ToPropertyMember(const ParsingPair<ParsingPair<ParsingPair<ParsingPair<ParsingPair<ParsingPair<ParsingPair<
 2     Ptr<ManagedAttributeInfo>,
 3     declatt::Accessor>,
 4     declatt::MemberType>,
 5     declatt::Inheritation>,
 6     Ptr<ManagedType>>,
 7     ParsingList<Ptr<ManagedType>>>,
 8     RegexToken>,
 9     ParsingPair<
10         ParsingList<Ptr<ManagedStatement>>,
11         ParsingList<ParsingPair<ParsingList<declatt::Accessor>, Ptr<ManagedStatement>>>
12         >>& input)
13 {
14     Ptr<ManagedProperty> member=CreateNode<ManagedProperty>(input.First().Second());
15     CopyAttributeInfo(member->attributeInfo, input.First().First().First().First().First().First().First());
16     member->accessor=input.First().First().First().First().First().First().Second();
17     member->memberType=input.First().First().First().First().First().Second();
18     member->inheritation=input.First().First().First().First().Second();
19     member->type=input.First().First().First().Second();
20     if(input.First().First().Second().Head())
21     {
22         member->implementedInterfaceType=input.First().First().Second().Head()->Value();
23     }
24     member->name=ConvertID(WString(input.First().Second().reading, input.First().Second().length));
25 
26     member->setterAccessor=member->accessor;
27     if(input.Second().First().Head())
28     {
29         member->getter=input.Second().First().Head()->Value();
30     }
31     if(input.Second().Second().Head())
32     {
33         if(input.Second().Second().Head()->Value().First().Head())
34         {
35             member->setterAccessor=input.Second().Second().Head()->Value().First().Head()->Value();
36         }
37         member->setter=input.Second().Second().Head()->Value().Second();
38     }
39     return member;
40 }
41 


    其次是用tuple和ref來賦值的:
 1 Ptr<ManagedMember> ToPropertyMember(const x::tp<
 2     Ptr<ManagedAttributeInfo>,
 3     declatt::Accessor,
 4     declatt::MemberType,
 5     declatt::Inheritation,
 6     Ptr<ManagedType>,
 7     x::opt<Ptr<ManagedType>>,
 8     RegexToken,
 9     x::tp<
10         x::opt<Ptr<ManagedStatement>>,
11         x::opt<x::tp<x::opt<declatt::Accessor>, Ptr<ManagedStatement>>>
12         >
13     >::ResultType& input)
14 {
15     Ptr<ManagedProperty> member=CreateNode<ManagedProperty>(input.First().Second());
16     x::Fill(
17         x::ref(member->attributeInfo)
18         .ref(member->accessor)
19         .ref(member->memberType)
20         .ref(member->inheritation)
21         .ref(member->type)
22         .ref(member->implementedInterfaceType)
23         .ref(member->name)
24         .ref(
25             x::ref(member->getter)
26             .ref(
27                 x::ref(member->setterAccessor)
28                 .ref(member->setter)
29                 )
30             )
31         , input);
32     member->name=ConvertID(member->name);
33     return member;
34 }
35 

    其簡潔程度完全不同。
posted on 2011-06-13 23:01 陳梓瀚(vczh) 閱讀(2975) 評論(0)  編輯 收藏 引用 所屬分類: VL++3.0開發紀事

評論:
# re: Vczh Library++3.0之如何把C#屬性parse出來的超長pair鏈表賦值到語法書上 2011-06-13 23:17 | 空明流轉
你何苦呢,C++11就可以了。  回復  更多評論
  
# re: Vczh Library++3.0之如何把C#屬性parse出來的超長pair鏈表賦值到語法書上 2011-06-13 23:34 | 陳梓瀚(vczh)
@空明流轉
0x也解決不了這個問題。  回復  更多評論
  
# re: Vczh Library++3.0之如何把C#屬性parse出來的超長pair鏈表賦值到語法書上 2011-06-14 01:17 | bennycen
Orz<Orz<Orz<Orz<Orz<Orz<Orz> > > > > >  回復  更多評論
  
# re: Vczh Library++3.0之如何把C#屬性parse出來的超長pair鏈表賦值到語法書上 2011-06-14 04:41 | 空明流轉
@空明流轉
pair list, 可以換做varadic template...  回復  更多評論
  
# re: Vczh Library++3.0之如何把C#屬性parse出來的超長pair鏈表賦值到語法書上 2011-06-15 01:07 | 陳梓瀚(vczh)
@空明流轉

tuple<a, b, ...> -> tuple<pair<a, b>, ...>
tuple<a, b> -> pair<a, b>

?  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国模精品娜娜一二三区| 欧美日韩成人综合天天影院| 美女网站在线免费欧美精品| 亚洲第一色中文字幕| 久久久国产一区二区| 一区二区高清在线观看| 欧美大片免费看| 亚洲一区在线播放| 亚洲在线观看免费| 好男人免费精品视频| 免费不卡在线观看| 欧美美女福利视频| 美日韩精品视频| 欧美日韩精品| 开心色5月久久精品| 欧美黄网免费在线观看| 日韩亚洲不卡在线| 欧美一区二区日韩| 亚洲一区二区三区四区中文| 亚洲性av在线| 美日韩精品视频免费看| 亚洲视频在线观看视频| 久久亚洲国产成人| 久久综合精品国产一区二区三区| 欧美片第一页| 亚洲二区免费| 激情久久五月天| 亚洲私人影院在线观看| 99视频在线精品国自产拍免费观看| 一本一道久久综合狠狠老精东影业| 国产精品视频午夜| 国产精品99久久久久久久久| 一区二区三区产品免费精品久久75 | 欧美成人午夜激情视频| 亚洲午夜视频| 激情av一区| 久久久综合网站| 欧美成人在线网站| 日韩午夜电影av| 欧美日韩福利在线观看| 洋洋av久久久久久久一区| 在线一区亚洲| 国产亚洲激情视频在线| 亚洲一二三区视频在线观看| 亚洲午夜伦理| 亚洲国产精品第一区二区| 六月婷婷久久| 亚洲人体1000| 欧美在线日韩精品| 韩日欧美一区二区| 欧美高潮视频| 午夜精品一区二区三区电影天堂| 国产精品一二三四区| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美高清视频一二三区| 99精品国产高清一区二区| 国产欧美一区二区精品性色| 久久蜜桃av一区精品变态类天堂| 一本一道久久综合狠狠老精东影业 | 香蕉成人伊视频在线观看| 亚洲福利av| 蜜臀va亚洲va欧美va天堂 | 久久一区二区三区超碰国产精品| 91久久线看在观草草青青| 欧美日韩国产丝袜另类| 久久久精品一区二区三区| 亚洲三级电影在线观看| 久久中文欧美| 久久亚洲综合| 久久永久免费| 玖玖综合伊人| 久久久一区二区| 久久av资源网站| 久久成人精品电影| 久久中文字幕一区| 国产精品大全| 欧美精品免费在线| 一区在线观看视频| 激情久久综合| 在线日韩一区二区| 在线精品国精品国产尤物884a| 国产在线乱码一区二区三区| 国产精品福利av| 在线观看日韩国产| 久久精品理论片| 欧美激情视频网站| 欧美三级电影大全| 在线日本欧美| 亚洲午夜久久久久久尤物 | 欧美中文字幕在线播放| 久久er99精品| 一区二区三区欧美| 久久精品国产精品亚洲| 欧美色图五月天| 加勒比av一区二区| 亚洲性图久久| 美女日韩在线中文字幕| 亚洲精品久久| 久久精彩免费视频| 国产精品久久久久久久久免费 | 久久综合九色99| 国产欧美在线看| 亚洲视屏在线播放| 亚洲国产精品成人精品| 久久经典综合| 国产精品视频午夜| 欧美亚洲在线播放| 99精品国产一区二区青青牛奶| 欧美成人免费观看| 亚洲成色777777女色窝| 麻豆91精品| 久久久久国色av免费观看性色| 久久夜色精品亚洲噜噜国产mv| 亚洲一区视频在线观看视频| 欧美日韩亚洲系列| 亚洲天堂成人| 亚洲香蕉在线观看| 国产精品麻豆va在线播放| 亚洲欧美制服另类日韩| 亚洲区一区二区三区| 欧美激情精品久久久久久蜜臀| 国内精品伊人久久久久av一坑| 久久噜噜噜精品国产亚洲综合| 久久精品国产免费看久久精品| 欧美一区二区日韩| 亚洲国产高清自拍| 亚洲精品乱码视频| 国产精品网曝门| 久久日韩粉嫩一区二区三区| 久久青草欧美一区二区三区| 日韩一级在线观看| 亚洲欧美视频一区| 亚洲一区激情| 久久精品一区二区三区四区| 亚洲欧洲美洲综合色网| 亚洲午夜电影网| 亚洲精品国久久99热| 国产精品99久久久久久久vr| 亚洲区欧美区| 亚洲女ⅴideoshd黑人| 亚洲国产精品成人| 亚洲一级片在线看| 亚洲精品日韩欧美| 久久综合电影| 久久午夜色播影院免费高清| 欧美婷婷六月丁香综合色| 欧美成人免费在线观看| 亚洲国产天堂久久综合网| 久久精品系列| 国产精品你懂得| 日韩亚洲欧美在线观看| 亚洲视频欧美视频| 欧美三级黄美女| 亚洲曰本av电影| 欧美专区在线| 激情国产一区| 欧美精品www在线观看| 欧美国产日产韩国视频| 亚洲人人精品| 欧美午夜无遮挡| 久久精品国产久精国产一老狼| 老司机精品视频网站| 亚洲精品五月天| 欧美视频在线观看免费网址| 亚洲女ⅴideoshd黑人| 久久精品国产亚洲5555| 亚洲日本理论电影| 在线精品一区二区| 国产精品日本精品| 久久久久九九九九| 亚洲国产欧美日韩精品| 日韩亚洲欧美一区| 激情欧美日韩| 一区二区三区|亚洲午夜| 亚洲大片在线| 美女视频网站黄色亚洲| 久久艳片www.17c.com| 久久这里只精品最新地址| 久久久91精品| 欧美激情1区| 亚洲美女精品成人在线视频| 亚洲精品乱码视频| 亚洲狼人综合| 亚洲视频电影图片偷拍一区| 艳女tv在线观看国产一区| av成人激情| 久久国产天堂福利天堂| 久久久久成人精品免费播放动漫| 久久精品免费| 欧美国产精品v| 国产精品视频网址| 欧美午夜剧场| 欧美精品国产一区二区| 欧美一区二区在线看| 亚洲尤物在线视频观看| 亚洲国内自拍| 亚洲一区二区三区高清不卡| 夜夜嗨av一区二区三区四季av| 激情视频一区| 亚洲国产清纯|