1 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
不
最簡(jiǎn)單的 劣勢(shì)的語(yǔ)體概念 分離關(guān)注點(diǎn)..你想表達(dá) 句法在一個(gè)地方 語(yǔ)義學(xué)在另一個(gè)。這有助于維護(hù)性(特別是用于編譯精神語(yǔ)法的冗長(zhǎng)編譯時(shí)間) 如果它們有副作用的話(huà),會(huì)產(chǎn)生更復(fù)雜的影響(這通常是這樣的)。想象一下,當(dāng)語(yǔ)義操作有一個(gè) 副作用解析器狀態(tài)將被恢復(fù),但外部效果不會(huì)恢復(fù)。 在某種程度上,使用屬性 只就像在函數(shù)程序中使用確定性的純函數(shù)一樣,更容易對(duì)程序的正確性進(jìn)行推理(或者,在本例中是 語(yǔ)法(狀態(tài)機(jī)) 編成純函數(shù)。 語(yǔ)義操作有一種傾向(但不一定是這樣),即按值引入更多的復(fù)制;這再加上大量的回溯,可以 降低性能..當(dāng)然,如果語(yǔ)義動(dòng)作“很重”,這本身就會(huì)妨礙解析的性能。
考慮使用 qi::locals<>
和 繼承屬性(代碼來(lái)自 Mini XML - ASTs!
樣本 )-它們涉及語(yǔ)義行為: xml = start_tag [at_c<0>(_val) = _1] >> *node >> end_tag(at_c<0>(_val)) // passing the name from the // ... start_tag as inherited attribute;
或 使用氣的一種:當(dāng)?shù)厝?/trans> :rule<char const*, locals<char> > rl;rl = alpha[_a = _1] >> char_(_a); // get two identical characterstest_parser("aa", rl); // passtest_parser("ax", rl); // fail
國(guó)際海事組織,這些語(yǔ)義動(dòng)作通常不構(gòu)成問(wèn)題,因?yàn)楫?dāng)它們被回溯時(shí),下一次執(zhí)行傳遞(相同的)語(yǔ)義動(dòng)作時(shí), 本土化只會(huì)被新的,正確的,價(jià)值所覆蓋。 此外,有些工作是“快速和骯臟的”,不值得使用 烏特里或者手卷AST類(lèi)型: qi::phrase_parse(first, last, // imagine qi::istream_iterator... intesting_string_pattern // we want to match certain patterns on the fly [ log_interesting_strings ], // and pass them to our logger noise_skipper // but we skip all noise );
在這里,語(yǔ)義動(dòng)作是 巖心解析器的函數(shù)。它可以工作,因?yàn)樵诰哂姓Z(yǔ)義操作的節(jié)點(diǎn)級(jí)別上不涉及回溯。 語(yǔ)義行為是精神因果報(bào)應(yīng)中語(yǔ)義行為的鏡像,在那里,語(yǔ)義行為所帶來(lái)的問(wèn)題通常比氣中的問(wèn)題少,因此,即使只是為了界面/API的一致性,語(yǔ)義行為也是一件“好事”,提高了Boost精靈作為一個(gè)整體的可用性。
- 1 回答
- 0 關(guān)注
- 512 瀏覽
添加回答
舉報(bào)