2013-01-31 19 views
5

के रूप में लोड नहीं हो सकता है मैं अपने व्याकरण लिखने के लिए एंटरल 4 का उपयोग कर रहा हूं। मैं अपने व्याकरण द्वारा उत्पन्न गुई तीन देखना चाहता हूं। जब मैं एंटरल साइट (http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4) पर उदाहरण चलाने की कोशिश करता हूं तो यह काम करता है, लेकिन अगर मैं अपने व्याकरण के साथ प्रयास करता हूं तो यह काम नहीं करता है। विशेष रूप से मैंने नेटबीन और एंटरवर्क्स 2 पर व्याकरण को चलाने के लिए "टेस्टरिग में चलाएं" आदेश के साथ भी प्रयास करने की कोशिश की है, लेकिन परिणाम एक ही त्रुटि संदेश है "" समस्याएं लेक्सर या पार्सर के रूप में लोड नहीं कर सकती "।antlr 4 लेक्सर या पार्सर

यह मेरी व्याकरण है:

script 
    : include* 
     systemDef 
     labelsDef 
     issueDef* 
     observationDef* 
     actionDef* 
     procedure* 
    ; 

include 
    : USE qualifiedName EOS; 

systemDef 
    : SYSTEM definition; 

labelsDef 
    : LABELS COLON '{' label* '}' EOS ; 

label 
    : IDENTIFIER COLON literal EOS 
    ; 

issueDef 
    : ISSUES definition; 

observationDef 
    : OBSERVATIONS definition; 

actionDef 
    : ACTIONS definition; 

definition 
    : IDENTIFIER? parameters? (COLON block)? EOS 
    ; 

reference 
    : IDENTIFIER? parameters? (COLON)? (atClause (COMMA atClause)*)? EOS 
    ; 

parameters 
    : '[' param (COMMA param)* ']' 
    ; 

param 
    : literal 
    | IDENTIFIER 
    ; 

literal 
    : STRINGLITERAL 
    | INTEGET_LITERAL 
    | PERCENTAGELITERAL 
    | FLOATLITERAL 
    | TRUE 
    | FALSE 
    ; 

block 
    : '{' ((marker)? (definition | reference))+ '}' 
    ; 

marker 
    : PLUS 
    | MINUS 
    | MULTIPLY 
    | SHARP 
    | QUESTION_MARK 
    ; 

atClause 
    : '@' qualifiedName parameters? 
    ; 

qualifiedName 
    : (DOT)? IDENTIFIER (DOT IDENTIFIER)* 
    ; 

procedure 
    : PROCEDURE IDENTIFIER params? COLON body 
    ; 

params 
    : '[' IDENTIFIER (COMMA IDENTIFIER)* ']' 
    ; 

body 
    : statement 
    | '{' statement* '}' 
    ; 

statement 
    : assignment 
    | expression // .str??? 
    | callExpression 
    | ifStatement 
    | whileStatement 
    | repeatStatement 
    | forStatement 
    ; 

assignment 
    : qualifiedName ASSIGN expression (EOS)? 
    ; 

expression 
    : conditionalOrExpression (EOS)?; 

conditionalOrExpression 
    : conditionalAndExpression (OR conditionalAndExpression)* 
    ; 

conditionalAndExpression 
    : equalityExpression (AND equalityExpression)* 
    ; 

equalityExpression 
    : stringExpression (equalityOp stringExpression)? 
    ; 

equalityOp 
    : EQUAL 
    | NE 
    ; 

stringExpression 
    : relationalExpression ('§' stringExpression)? 
    ; 

relationalExpression 
    : additiveExpression (relationalOp additiveExpression)* 
    ; 

relationalOp 
    : '<=' 
    | '>=' 
    | '<' 
    | '>' 
    ; 

additiveExpression 
    : multiplicativeExpression ((PLUS | MINUS) multiplicativeExpression)* 
    ; 

multiplicativeExpression 
    : unaryExpression ((MULTIPLY | DIVIDE) unaryExpression)* 
    ; 

unaryExpression 
    : (PLUS | MINUS | NOT)? basicExpression 
    ; 

basicExpression 
    : rangeExpression 
    | callExpression 
    | qualifiedName // .str > 
    | percentageExpression 
    | '(' expression ')' 
    | literal 
    ; 

percentageExpression 
    : PERCENTAGELITERAL 'of' additiveExpression 
    ; 

rangeExpression 
    : qualifiedName '(' ThreeDigits '..' ThreeDigits ')' (EOS)? 
    ; 

callExpression 
    : qualifiedName arguments (EOS)? 
    ; 

arguments 
    : '(' (expression (COMMA expression)*)? ')' 
    ; 

ifStatement // (ELSE body)? 
    : IF '(' expression ')' body 
     (ELSE ifStatement | body)? 
    ; 

whileStatement 
    : WHILE '(' expression ')' body 
    ; 

repeatStatement 
    : REPEAT body UNTIL '(' expression ')' EOS 
    ; 

forStatement 
    : FOR .qualifiedName ASSIGN value TO value STEP value body 
    ; 

value 
    : FLOATLITERAL 
    ; 

और यह मेरा फ़ाइल build.xml है:

<target name="-pre-compile" depends="antlr"> 
    </target> 

    <target name="init-antlr"> 
     <!-- Full path to Antlr jar --> 
     <property name="antlr-4.0-complete.jar" location="C:/Users/Mary/Documents/TesiMagistrale/lib/antlr-4.0-complete.jar"/> 
     <!-- Grammar path --> 
     <property name="antlr.grammar" location="src/troubles/lang/Troubles.g4"/> 
     <!--<property name="antlr.lexer" location="src/trouble/lang/TroublesL.g4"/>--> 
    </target> 

    <target name="antlr" depends="init-antlr" unless="up-to-date"> 
     <!-- Compiling grammar --> 
     <java classname="org.antlr.v4.Tool" fork="true"> 
      <arg value="${antlr.grammar}"/> 
      <!--<arg value="${antlr.lexer}"/>--> 
      <arg value="-visitor"/> 
      <classpath path="${antlr-4.0-complete.jar}"/> 
     </java> 
    </target> 
+3

यह उपयोगी हो सकता है अगर आप या तो अपने व्याकरण या, यह काफी लंबा है, तो, एक [sscce] (http शामिल हो सकते हैं: मैं संकुल जिसे आप यहां प्राप्त कर सकते हैं का समर्थन करने के TestRig का एक संस्करण समझौता // sscce.org) जो इस मुद्दे को प्रदर्शित करता है। इससे दूसरों को समस्या का तुरंत निदान करने में मदद मिलेगी और आप इसे स्वयं प्रक्रिया में भी खोज सकते हैं। – ig0774

उत्तर

6

मैं अपने जवाब को फिर से लिखने रहा हूँ इतना है कि यह अधिक सटीक है।

नेटबीन/एंटरलवर्क 2 में टेस्टरिग को सफलतापूर्वक चलाने में सबसे अधिक संभावना नहीं है क्योंकि आप अपने व्याकरण को डिफ़ॉल्ट पैकेज के अलावा किसी अन्य पैकेज में सेट करते हैं। आप अपने व्याकरण में कुछ इस तरह है, तो

@header { 
    package org.whatever.troubles; 
} 

इसे बाहर टिप्पणी और चलाने की कोशिश "TestRig में चलाएँ ..."। इसे इस तरह से काम करना चाहिए।

दुर्भाग्य से, "टेस्टरिग में चलाएं ..." सुविधा आपको पैकेज निर्दिष्ट करने की अनुमति नहीं देती है। आपको या तो अपने व्याकरण को डिफ़ॉल्ट पैकेज में रखना होगा, या कमांड प्रॉम्प्ट पर "grun" का उपयोग करना होगा।

मैं तय होने तक मैन्युअल रूप से ग्रून चलाने की अनुशंसा करता हूं। इसे संभालने का एक अच्छा तरीका है अपने स्रोत फ़ोल्डर में बैच फ़ाइल (run.bat) बनाना (जहां आपका .g4 है)। यह प्रोजेक्ट फलक में नेटबीन में दिखाई देगा जहां आप उस पर राइट-क्लिक कर सकते हैं और "रन" का चयन कर सकते हैं।

और, अभी भी अपने CLASSPATH सही होने चाहिए ...

सामग्री run.bat उदाहरण:

rem grun org.whatever.troubles.Troubles script -tokens -tree -gui test.txt 

java -cp .;C:\workdir\proj\dist\troubles.jar;C:\antlr-4.0-complete.jar;"C:\Program Files\Java\jre7\lib" org.whatever.troubles.Troubles script -tokens -tree -gui test.txt 
+7

'@header {package ...}' निर्माण एएनटीएलआर 4 में अप्रचलित है 4. इसके बजाय कोड जनरेटर को '-पैकेज' ध्वज पास करें। –

+1

@ 280Z28 आपको इसे एक उत्तर के रूप में सबमिट करना चाहिए। जानकारी के लिए धन्यवाद! –

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