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

隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
    Vczh Library++3.0的ManagedX(山寨C#)語法分析器寫好了。將近1000行的語法樹聲明,使用了ParserCombinator還有93k的語法分析器。寫了好久。其中遇到了一些問題,譬如說C#的語法實(shí)在太復(fù)雜,parse一個(gè)method也好property也好都會(huì)有一大堆東西。舉個(gè)例子,一個(gè)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 

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

    再舉一個(gè)例子,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 

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

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

    其次,當(dāng)我們面對(duì)這些pair<pair<pair<a, b>, c>, d>的時(shí)候,如何將他賦值到一個(gè)struct呢?假設(shè)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>。因?yàn)?#8220;點(diǎn)”也是左結(jié)合的。后面只需要再用模板元編程就可以把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)在使用了這個(gè)構(gòu)造之前和之后的代碼。首先是直接使用和讀取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 

    其簡(jiǎn)潔程度完全不同。
posted on 2011-06-13 23:01 陳梓瀚(vczh) 閱讀(2982) 評(píng)論(0)  編輯 收藏 引用 所屬分類: VL++3.0開發(fā)紀(jì)事

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

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

?  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99天天综合性| 亚洲视频一二三| 欧美人在线视频| 欧美精品日韩一区| 欧美—级a级欧美特级ar全黄| 欧美激情网友自拍| 亚洲婷婷综合色高清在线 | 久久久久久穴| 久久综合五月天婷婷伊人| 老牛嫩草一区二区三区日本| 欧美成人在线影院| 日韩一二三区视频| 午夜伦欧美伦电影理论片| 久久国产精品电影| 暖暖成人免费视频| 国产精品久久久久毛片软件| 国产一区二区观看| 亚洲精品在线免费| 欧美亚洲在线视频| 亚洲高清不卡| 亚洲一区二区视频| 欧美www视频| 国产日韩欧美制服另类| 亚洲日本中文字幕免费在线不卡| 亚洲一区国产| 欧美第十八页| 亚洲欧美日韩国产综合| 欧美成人在线影院| 国产亚洲精品久久久久久| 亚洲人体1000| 久久频这里精品99香蕉| 一区二区三区毛片| 蘑菇福利视频一区播放| 国产欧美日本| 亚洲在线电影| 亚洲黄色大片| 久久综合九色综合欧美狠狠| 国产精品色婷婷久久58| 一区二区日韩免费看| 欧美ed2k| 久久久久国产精品午夜一区| 国产精品久久久久久五月尺| 日韩视频第一页| 麻豆精品视频在线| 欧美一区二区在线免费播放| 欧美日韩一区综合| 一本色道久久综合亚洲91| 欧美福利网址| 久久综合电影| 亚洲电影免费观看高清完整版在线观看 | 国产精品视频自拍| 99国产精品视频免费观看| 欧美 日韩 国产 一区| 欧美亚洲三区| 国产精品入口夜色视频大尺度| 99精品国产在热久久婷婷| 欧美电影免费观看高清| 久久久久国产精品麻豆ai换脸| 国产一区二区精品久久| 国产精品美女主播| 国外成人免费视频| 午夜精品福利视频| 一本色道久久综合一区| 欧美日韩国产首页| 一本色道久久综合狠狠躁篇的优点 | 99re6这里只有精品视频在线观看 99re6这里只有精品 | 国产精品国产三级欧美二区| 99综合电影在线视频| 日韩一二三区视频| 国产精品国产三级欧美二区| 亚洲一区亚洲二区| 亚洲在线视频一区| 国产原创一区二区| 欧美va日韩va| 欧美精品在欧美一区二区少妇| 亚洲美女淫视频| 一区二区欧美国产| 国产一区二区三区高清| 欧美v日韩v国产v| 欧美成人在线影院| 午夜精品在线观看| 久久婷婷av| 亚洲图片自拍偷拍| 香蕉久久久久久久av网站| 红桃视频成人| 91久久极品少妇xxxxⅹ软件| 欧美日韩伊人| 久久美女性网| 欧美国产视频在线| 性刺激综合网| 蜜桃av综合| 亚洲欧美综合精品久久成人| 久久激情视频免费观看| 亚洲国产精品日韩| 宅男精品导航| 樱桃成人精品视频在线播放| 亚洲精品久久久久久久久久久久| 欧美性大战久久久久| 久久免费视频这里只有精品| 欧美国产第一页| 久久狠狠亚洲综合| 欧美日韩xxxxx| 久热综合在线亚洲精品| 欧美日韩大片一区二区三区| 久久国产一区| 欧美日韩在线电影| 免费一区二区三区| 国产农村妇女精品一区二区| 亚洲国产精品第一区二区| 国产欧美一区二区精品忘忧草| 亚洲人成小说网站色在线| 韩国亚洲精品| 亚洲午夜久久久久久久久电影院| 久久综合色播五月| 久久精品亚洲一区二区| 亚洲一区二区三区免费视频| 久久婷婷国产综合国色天香| 欧美一区二区女人| 欧美久久久久久久久| 免费不卡视频| 国产亚洲精品aa| 艳女tv在线观看国产一区| 亚洲国产日韩欧美| 久久精品成人| 久久精品亚洲一区二区| 国产精品爽爽ⅴa在线观看| 亚洲卡通欧美制服中文| 亚洲欧洲另类| 美女视频一区免费观看| 久久影院亚洲| 精品成人国产| 久久蜜臀精品av| 久久综合久久综合久久综合| 国产伦精品一区二区三区视频孕妇| 99热精品在线| 国产精品99久久久久久人| 欧美极品aⅴ影院| 亚洲精品综合精品自拍| 一本色道久久综合一区| 欧美日韩亚洲视频| 中文国产成人精品| 欧美亚洲视频| 国内精品国产成人| 久久久久一区二区三区| 欧美va天堂在线| 亚洲人成免费| 欧美日韩在线电影| 亚洲淫性视频| 久久久久国产精品一区| 极品日韩久久| 欧美成人免费在线| 99这里有精品| 欧美在线精品免播放器视频| 国内精品美女在线观看| 媚黑女一区二区| 亚洲另类在线视频| 午夜在线视频观看日韩17c| 国产亚洲欧美一区二区| 开元免费观看欧美电视剧网站| 亚洲高清在线视频| 亚洲欧美国产高清| 黄色av成人| 欧美日韩国产成人在线| 亚洲欧美中文字幕| 欧美二区在线| 亚洲欧美激情四射在线日 | 亚洲欧美日韩直播| 久久午夜视频| 亚洲另类自拍| 国产精品一二三视频| 久久久精品动漫| 一本一本a久久| 久久久久久夜精品精品免费| 亚洲国产一区二区三区在线播| 欧美日本免费| 久久久久国产一区二区三区四区| 亚洲激情亚洲| 久久精品视频免费播放| 欧美伊人精品成人久久综合97| 夜夜躁日日躁狠狠久久88av| 欧美色图五月天| 久久久久免费视频| 99在线热播精品免费| 玖玖精品视频| 亚洲欧美欧美一区二区三区| 在线观看中文字幕亚洲| 国产精品私人影院| 欧美剧在线免费观看网站| 久久精品夜色噜噜亚洲aⅴ| 国产精品99久久久久久久女警| 欧美成人午夜激情视频| 久久狠狠婷婷| 亚洲在线一区二区三区| 亚洲人成在线观看一区二区| 狠狠色狠狠色综合| 国产视频一区三区| 国产精品久久久久久久久婷婷 | 久久精视频免费在线久久完整在线看| 夜夜嗨av一区二区三区中文字幕 | 一区二区三区视频在线|