2012-05-09 10 views
9

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

एएनटीएलआर के हाल के संस्करण का भी उपयोग करना।

+4

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

+0

यदि आप त्रुटियों या सुरक्षा के लिए स्थैतिक विश्लेषण करने पर विचार कर रहे हैं तो आपको शायद एएसटी से अधिक की आवश्यकता होगी और पेड़ फिर से लिखने वाले नियमों को एएनटीएलआर द्वारा प्रदान किया जाएगा। आप चाहते हैं कि आप [स्ट्रेटगो/एक्सटी] (http://en.wikipedia.org/wiki/Stratego/XT) के साथ संयोजन में एएनटीएलआर का उपयोग करें। मुझे नहीं पता कि किसी के पास आप जो चाहते हैं उसका मुफ्त सार्वजनिक संस्करण है। अच्छा प्रश्न। यदि आप प्रोफेशनल गुणवत्ता उपकरण चाहते हैं तो ईरा की प्रोफ़ाइल देखें। –

+1

संकलित बाइटकोड को देखकर चर और विधियों की गणना करना अधिक आसान होगा, उदाहरण के लिए एएसएम बाइटकोड ढांचे का उपयोग करना। –

उत्तर

12

मैंने सोचा कि मैं अपने लंच ब्रेक पर इस पर एक दरार लेगा। यह आपकी समस्या को पूरी तरह से हल नहीं कर सकता है, लेकिन यह आपको शुरू करने के लिए एक जगह दे सकता है। उदाहरण मानता है कि आप एक ही निर्देशिका में सबकुछ कर रहे हैं।

  1. गिटहब से ANTLR source डाउनलोड करें। एएनटीएलआर साइट से पूर्व संकलित "पूर्ण" जार एक ज्ञात बग है। गिटहब रेपो में फिक्स है।

  2. एएनटीएलआर टैरबॉल निकालें।

    % tar xzf antlr-antlr3-release-3.4-150-g8312471.tar.gz
  3. एएनटीएलआर "पूर्ण" जार बनाएं।

    % cd antlr-antlr3-8312471 
    % mvn -N install 
    % mvn -Dmaven.test.skip=true 
    % mvn -Dmaven.test.skip=true package assembly:assembly 
    % cd -
  4. Java grammar डाउनलोड करें। कुछ भी हैं, लेकिन मुझे यह एक काम पता है।

  5. व्याकरण को जावा स्रोत में संकलित करें।

    % mkdir com/habelitz/jsobjectizer/unmarshaller/antlrbridge/generated 
    % mv *.g com/habelitz/jsobjectizer/unmarshaller/antlrbridge/generated 
    % java -classpath antlr-antlr3-8312471/target/antlr-master-3.4.1-SNAPSHOT-completejar.jar org.antlr.Tool -o com/habelitz/jsobjectizer/unmarshaller/antlrbridge/generated Java.g
  6. जावा स्रोत संकलित करें।

    % javac -classpath antlr-antlr3-8312471/target/antlr-master-3.4.1-SNAPSHOT-completejar.jar com/habelitz/jsobjectizer/unmarshaller/antlrbridge/generated/*.java
  7. निम्नलिखित स्रोत फ़ाइल Main.java जोड़ें।

    import java.io.IOException; 
    import java.util.List;
    import org.antlr.runtime.*; import org.antlr.runtime.tree.*;
    import com.habelitz.jsobjectizer.unmarshaller.antlrbridge.generated.*;
    public class Main { public static void main(String... args) throws NoSuchFieldException, IllegalAccessException, IOException, RecognitionException { JavaLexer lexer = new JavaLexer(new ANTLRFileStream(args[1], "UTF-8")); JavaParser parser = new JavaParser(new CommonTokenStream(lexer)); CommonTree tree = (CommonTree)(parser.javaSource().getTree()); int type = ((Integer)(JavaParser.class.getDeclaredField(args[0]).get(null))).intValue(); System.out.println(count(tree, type)); } private static int count(CommonTree tree, int type) { int count = 0; List children = tree.getChildren(); if (children != null) { for (Object child : children) { count += count((CommonTree)(child), type); } } return ((tree.getType() != type) ? count : count + 1); } }
  8. संकलन।

    % javac -classpath .:antlr-antlr3-8312471/target/antlr-master-3.4.1-SNAPSHOT-completejar.jar Main.java
  9. जावा स्रोत का एक प्रकार है कि आप की गणना करना चाहते; उदाहरण के लिए, VAR_DECLARATOR, FUNCTION_METHOD_DECL, या VOID_METHOD_DECL। किसी भी फाइल पर

    % cat com/habelitz/jsobjectizer/unmarshaller/antlrbridge/generated/Java.tokens
  10. भागो, हाल ही में बनाए Main.java भी शामिल है।

    % java -classpath .:antlr-antlr3-8312471/target/antlr-master-3.4.1-SNAPSHOT-completejar.jar Main VAR_DECLARATOR Main.java 
    6

यह निश्चित रूप से, अपूर्ण है। यदि आप बारीकी से देखते हैं, तो आपने देखा होगा कि बढ़ाए गए for कथन के स्थानीय चर की गणना नहीं की गई थी। के लिए, आप बल्कि VAR_DECLARATOR से, प्रकार FOR_EACH उपयोग करने की आवश्यकता होगी।

आप जावा स्रोत के तत्वों की अच्छी समझ की जरूरत है, और इस विशेष व्याकरण की परिभाषा के लिए कैसे उन मैच में उचित अनुमान लेने के लिए सक्षम हो जाएगा। तुम भी संदर्भ की गिनती करने में सक्षम नहीं होगा। घोषणाओं आसान है, लेकिन एक क्षेत्र का उपयोग करता है गिनती, उदाहरण के लिए, संदर्भ संकल्प की आवश्यकता है।p.C.f एक पैकेज p अंदर एक स्थिर क्षेत्र एक वर्ग C की f का उल्लेख करता है, या यह एक उदाहरण क्षेत्र वस्तु की f एक स्थिर क्षेत्र एक वर्ग p की C द्वारा संग्रहीत का उल्लेख करता है? मूल पार्सर्स जावा के रूप में जटिल भाषाओं के संदर्भों को हल नहीं करते हैं, क्योंकि सामान्य मामला बहुत मुश्किल हो सकता है। यदि आप इस स्तर के नियंत्रण चाहते हैं, तो आपको एक कंपाइलर (या इसके करीब कुछ) का उपयोग करने की आवश्यकता होगी। ग्रहण कंपाइलर एक लोकप्रिय पसंद है।

मुझे यह भी जिक्र करना चाहिए कि आपके पास एएनटीएलआर के अलावा अन्य विकल्प हैं। जावासीसी एक और पार्सर जेनरेटर है। स्थिर विश्लेषण उपकरण पीएमडी, जो जावासीसी को अपने पार्सर जनरेटर के रूप में उपयोग करता है, आपको कस्टम नियम लिखने की अनुमति देता है जिसका उपयोग आपके द्वारा इंगित की गई गणनाओं के प्रकार के लिए किया जा सकता है।

+0

सिंटैक्स के उदाहरणों की गिनती के दृष्टिकोण से (उदा।, # परिवर्तनीय घोषणाएं) यह एक अच्छा जवाब है। ओपी वह और क्या करना चाहता है पर अपारदर्शी है; स्थैतिक विश्लेषण आमतौर पर गिनती से काफी दूर जाता है, और आम तौर पर एक प्रतीक तालिका की आवश्यकता होती है और अक्सर प्रवाह विश्लेषण की आवश्यकता होती है। अगर उसे सिर्फ गिनती की ज़रूरत है, तो आपका समाधान आड़ू है (इसलिए +1); अगर उसे और अधिक चाहिए, तो यह कट नहीं करेगा, नाम संकल्प जावा के लिए अकेले प्रवाह विश्लेषण करना मुश्किल है। –

+0

@IraBaxter: सहमत है कि मेरा समाधान संभवतः केवल आंशिक है। मुझे संदेह है कि उनकी जरूरतें अपेक्षाकृत जटिल हैं, साथ ही यह एएनटीएलआर के साथ गड़बड़ करने के लिए बस मजेदार था। –

+0

यह एक अस्पष्ट सवाल है क्योंकि मुझे वास्तव में एंटरलर के हाल के संस्करण के साथ काम करने के लिए जावा व्याकरण नहीं मिला है। वाक्यविन्यास 2.0 रिलीज और 3.0 से एक बड़ा सौदा बदल गया। पुराने संस्करण की ओर ऑनलाइन बहुत सारे दस्तावेज़ तैयार किए गए थे। यह मुझे फेंक रहा था। मैं ज्यादातर एंटीलर के साथ वाक्यविन्यास और दृष्टिकोण में रुचि रखते थे। मेरा वास्तविक कार्य बहुत बुनियादी था। –

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