2012-02-26 25 views
8

क्या किसी दिए गए जावास्क्रिप्ट कोड के लिए v8 इंजन के एएसटी तक पहुंच बनाना संभव है? मैं वी 8 इंजन का उपयोग कर एक जावास्क्रिप्ट स्टेटिक विश्लेषक पर काम कर रहा हूं।V8 इंजन के सार सिंटेक्स ट्री तक पहुंचें

+1

संभावित डुप्लिकेट [मैं v8 पार्स पेड़ का उपयोग कैसे कर सकता हूं इसे कैसे किया जा सकता है?] (Http://stackoverflow.com/questions/8550774/how-do-i-access-v8-parse-tree-how- कर सकते हैं) – zengr

उत्तर

10

यह सुंदर पुराना है लेकिन शायद इस सवाल का जवाब में मदद करता है

http://v8.googlecode.com/svn/trunk/src/ast.h

~ चीयर्स:

मैं हेडर फ़ाइल जो सुंदर बताता है कि वहाँ वी 8 के एएसटी पर इस्तेमाल किया जा करने के लिए पर एक नज़र लेने के लिए सुझाव देते हैं कोई इस पर ठोकर खा रहा है। जवाब हां है, मानते हुए कि आप वी 8 को संशोधित करने और इसके अपने संस्करण को संकलित करने के इच्छुक हैं।

हां, तो compiler.cc में आप एक जगह जहां MakeCodeMakeFunctionInfo जो एएसटी कि में संग्रहीत किया जाता बदल देती भर कहा जाता है मिल जाए मूल कोड में CompilationInfo वस्तु में पारित कर दिया। आप तो आप MakeCode को कॉल करने से पहले निम्नलिखित लाइनों डालने से एएसटी निरीक्षण कर सकते हैं एक वर्ग है कि AstVisitor से विरासत लिखने की ज़रूरत:

MyAstVisitor mAV; 
// this will call VisitFunctionLiteral in your AST visitor 
info->function()->Accept(mAV); 

वी 8 कार्यों को संकलित रूप में जस्ट-इन-समय था जब वे वास्तव में हैं कहा जाता है, संकलन Lazy में एक और स्थान है जहां आपको कॉलिंग स्क्रिप्ट के निष्पादन के दौरान अपने एएसटी प्राप्त करने के लिए ऐसा करना होगा।

आलसी संकलन की वजह से यह संभवतः आपको स्थिर विश्लेषण करने में सक्षम नहीं करेगा, क्योंकि आपके पास आलसी संकलित सामग्री के लिए एएसटी तक पहुंचने से पहले निष्पादन पहले ही प्रगति पर है। लेकिन एएसटी प्राप्त करने के लिए यह है।

1

उपयोग --print-ast के माध्यम से SetFlagsFromString

+1

मुझे लगता है कि ओपी एएसटी तक एक डेटास्ट्रक्चर के रूप में पहुंच चाहता है जिसे वह क्रॉल कर सकता है। सच है, वह इस तरह निर्यात कर सकता है और अपना खुद का एएसटी रीडर बना सकता है, और अपने स्वयं के डेटा संरचनाओं को क्रॉल कर सकता है, लेकिन मुझे संदेह है कि यदि संभव हो तो वह उस कठोरता से बचना चाहता है। –

+0

क्या आप जानते हैं कि वह ध्वज अभी भी मौजूद है? –

0

ठीक है, मैं आप क्या हासिल करना चाहते पता नहीं है, लेकिन यह लगता है कि आप (या शायद जावास्क्रिप्ट संदर्भ के लिए आवरण वर्गों बारे में अपनी सी ++ कोड अंदर से एएसटी संशोधित करना चाहते हैं उनके लिए भी?)।