2009-05-14 16 views
10

मैं एक बंद-स्रोत एप्लिकेशन का उपयोग कर रहा हूं जो लुआ स्क्रिप्ट लोड करता है और इन स्क्रिप्ट को संशोधित करके कुछ अनुकूलन की अनुमति देता है। दुर्भाग्य से उपयोगी लॉग आउटपुट उत्पन्न करने में यह एप्लिकेशन बहुत अच्छा नहीं है (यदि मुझे लुआ स्क्रिप्ट में से कोई एक में गलत लगता है तो मुझे लगता है कि 'स्क्रिप्ट विफल' है)।संभावित त्रुटियों के लिए लूआ कोड का सांख्यिकीय विश्लेषण

मुझे एहसास है कि गतिशील भाषाएं उदाहरण के लिए सी ++ कोड का विश्लेषण करने के तरीके में स्थिर कोड विश्लेषण के लिए काफी प्रतिरोधी हैं।

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

अनिवार्य रूप से मैं क्या तलाश कर रहा हूँ एक उपकरण है कि एक स्क्रिप्ट के लिए:

local a 
print b 

उत्पादन होगा: सबसे बातों के लिए चेतावनी

warning: script.lua(1): local 'a' is not used' 
warning: script.lua(2): 'b' may not be defined' 

यह केवल वास्तव में हो सकता है लेकिन है कि अभी भी होगा उपयोगी! क्या ऐसा उपकरण मौजूद है? या हो सकता है कि एक लूआ आईडीई उस सुविधा के साथ बनाये?

धन्यवाद, क्रिस

उत्तर

9

लुआ के लिए स्वचालित स्थिर कोड विश्लेषण सामान्य रूप से एक आसान काम नहीं है। हालांकि, व्यावहारिक समस्याओं के सीमित सेट के लिए यह काफी कामयाब है।

त्वरित googling for "lua lint" पैदावार इन दो टूल: lua-checker और Lua lint

हालांकि आप अपनी विशिष्ट आवश्यकताओं के लिए अपना खुद का टूल रोल करना चाहते हैं।

Metalua स्थिर लुआ कोड विश्लेषण के लिए सबसे शक्तिशाली उपकरण में से एक है। उदाहरण के लिए, कृपया वैश्विक चर उपयोग उपयोग के लिए टूल metalint देखें।

कृपया Metalua mailing list पर अपना प्रश्न पोस्ट करने में संकोच न करें। लोग आमतौर पर बहुत उपयोगी होते हैं।

1

आप lua के लिए एक पार्सर लगता है (खुला स्रोत के रूप में उपलब्ध होना चाहिए) और इसका इस्तेमाल एक उचित एएसटी पेड़ में स्क्रिप्ट पार्स करने के लिए की जरूरत है। एक चर या परिभाषित नहीं होने पर पता लगाने के लिए उस पेड़ और एक साधारण परिवर्तनीय दृश्यता ट्रैकर का उपयोग करें।

आमतौर पर scoping नियम सरल हैं: उस नोड के लिए बच्चे बयान पर शीर्ष एएसटी नोड के साथ

  • शुरू और एक खाली गुंजाइश
  • आइटम नज़र। प्रत्येक चरणीय घोषणा मौजूदा दायरे में जोड़ दी जानी चाहिए।
  • यदि कोई नया दायरा शुरू हो रहा है (उदाहरण के लिए {ऑपरेटर के माध्यम से) वर्तमान स्कोप में चर को विरासत में मिलाकर एक नया चरणीय स्कोप बनाएं)।
  • जब कोई दायरा समाप्त हो रहा है (उदाहरण के लिए}} वर्तमान बाल परिवर्तनीय दायरे को हटा दें और माता-पिता पर वापस आएं।
  • ध्यान से Iterate।

यह आपको एएसटी के अंदर जहां चर दिखाई दे रहा है, प्रदान करेगा। आप इस जानकारी का उपयोग कर सकते हैं और यदि आप अभिव्यक्ति एएसटी नोड्स (चर के पढ़ने/लिखने) का भी निरीक्षण करते हैं तो आप अपनी जानकारी पा सकते हैं।

+0

शायद आप "{" और "}" (जो लुआ में टेबल कंस्ट्रक्टर के रूप में कार्य करते हैं) का अर्थ नहीं है, लेकिन "डू" और "एंड" कीवर्ड (विभिन्न नियंत्रण संरचनाएं जैसे कि फिर-फिर, दो प्रकार के लूप के लिए आदि।)। –

+0

मुझे नहीं पता कि लुआ भाषा कैसा दिखता है :-) लेकिन मुझे लगता है कि इसमें "परिवर्तनीय दायरा" का कुछ विचार है। मैंने हाल ही में जावा के लिए इस तरह की चीज की है। –

2

ग्लोबल्स की जांच के लिए, this lua-l posting देखें। स्थानीय लोगों की जांच करना कठिन है।

+0

लुआ 5.2 के लिए, http://lua-users.org/lists/lua-l/2012-12/msg00397.html देखें। – lhf

2

lua-inspect भी है, जो मेटलुआ पर आधारित है जो पहले से ही उल्लेख किया गया था। मैंने इसे ZeroBrane Studio IDE में एकीकृत किया है, जो आपके द्वारा अपेक्षित अपेक्षाओं के समान उत्पादन उत्पन्न करता है। विवरण के लिए यह SO उत्तर देखें: https://stackoverflow.com/a/11789348/1442917

संबंधित मुद्दे