मैं की तरह पेड़ भाव की तरह एक सी समारोह पार्स करने के लिए कोशिश कर रहा हूँ निम्नलिखित (का उपयोग कर Spirit Parser Framework):बूस्ट आत्मा के साथ एक व्याकरण पार्स
F(A() , B(GREAT(SOME , NOT)) , C(YES))
इस मैं निम्नलिखित पर तीन नियमों का उपयोग करने के लिए कोशिश कर रहा हूँ व्याकरण:
template< typename Iterator , typename ExpressionAST >
struct InputGrammar : qi::grammar<Iterator, ExpressionAST(), space_type> {
InputGrammar() : InputGrammar::base_type() {
tag = (qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9"))[ push_back(at_c<0>(qi::_val) , qi::_1) ];
command = tag [ at_c<0>(qi::_val) = at_c<0>(qi::_1) ] >> "(" >> (*instruction >> ",")
[ push_back(at_c<1>(qi::_val) , qi::_1) ] >> ")";
instruction = (command | tag) [qi::_val = qi::_1];
}
qi::rule< Iterator , ExpressionAST() , space_type > tag;
qi::rule< Iterator , ExpressionAST() , space_type > command;
qi::rule< Iterator , ExpressionAST() , space_type > instruction;
};
सूचना है कि मेरे टैग के नियम सिर्फ भाव ('समारोह के नाम) में इस्तेमाल पहचानकर्ता पर कब्जा करने की कोशिश करता है। यह भी ध्यान दें कि टैग नियम का हस्ताक्षर std::string
के बजाय ExpressionAST
देता है, जैसा कि अधिकांश उदाहरणों में है। कारण मैं इसे इस तरह करना चाहता हूं वास्तव में बहुत आसान है: मुझे भिन्नताओं का उपयोग करने से नफरत है और यदि संभव हो तो मैं उनसे बचूंगा। केक को रखना और इसे भी खाने के लिए बहुत अच्छा होगा मुझे लगता है।
एक आदेश एक टैग (वर्तमान नोड का नाम, एएसटी नोड का पहला स्ट्रिंग फ़ील्ड) और कोष्ठक द्वारा संलग्न तर्कों की एक चर संख्या से शुरू होना चाहिए, और प्रत्येक तर्क एक टैग या अन्य कमांड हो सकता है ।
हालांकि, यह उदाहरण बिल्कुल काम नहीं करता है। यह संकलित करता है और सब कुछ, लेकिन रन समय पर यह मेरे सभी परीक्षण तारों को पार्स करने में विफल रहता है। और जो चीज वास्तव में मुझे परेशान करती है वह यह है कि मैं इसे ठीक करने का तरीका नहीं समझ सकता, क्योंकि मैं वास्तव में शब्द के पारंपरिक अर्थ में उपर्युक्त कोड को डीबग नहीं कर सकता। असल में एकमात्र तरीका मैं देखता हूं कि मैं उपरोक्त कोड को ठीक कर सकता हूं यह जानकर कि मैं क्या गलत कर रहा हूं।
तो सवाल यह है कि मुझे नहीं पता कि उपर्युक्त कोड में क्या गलत है। आप उपरोक्त व्याकरण को कैसे परिभाषित करेंगे? एक सामान्य ब्रेक का उपयोग करें और दृष्टिकोण को देखने के लिए
struct MockExpressionNode {
std::string name;
std::vector<MockExpressionNode> operands;
typedef std::vector<MockExpressionNode>::iterator iterator;
typedef std::vector<MockExpressionNode>::const_iterator const_iterator;
iterator begin() { return operands.begin(); }
const_iterator begin() const { return operands.begin(); }
iterator end() { return operands.end(); }
const_iterator end() const { return operands.end(); }
bool is_leaf() const {
return (operands.begin() == operands.end());
}
};
BOOST_FUSION_ADAPT_STRUCT(
MockExpressionNode,
(std::string, name)
(std::vector<MockExpressionNode>, operands)
)
कुछ जो मैंने हाल ही में पाया है वह यह है कि सी और सी ++ पहचानकर्ताओं के नाम पर '$' अक्षर हो सकते हैं। ताकि ए-जेड, ए-जेड, 0-9 (पहले अक्षर को छोड़कर), _ और $ सी/सी ++ पहचानकर्ता में मान्य हैं। – Cthutu
@Cthutu एमएसवीसी पहचानकर्ताओं में उच्चारण वर्णों की अनुमति देता है। इसका मतलब यह मानक अनुपालन नहीं है। –
अधिक महत्वपूर्ण बात यह है कि आप जिस बिंदु को @Cthutu बनाने की कोशिश कर रहे हैं? पहचानकर्ताओं में कमी है? क्या आपका कंपाइलर नामस्थानों का सही ढंग से समर्थन नहीं करता है? – sehe