2013-01-31 5 views
5

Sto usando antlr 4 per scrivere la mia grammatica. Mi piacerebbe vedere il gui tre generato dalla mia grammatica. Quando provo a eseguire l'esempio sul sito antlr (http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4), funziona, ma se provo con la mia grammatica non funziona. In particolare ho provato anche a eseguire la grammatica su NetBeans e AntlrWorks 2 con il comando "Esegui in TestRig ..", ma il risultato è lo stesso messaggio di errore "Impossibile caricare i problemi come lexer o parser" ".antlr 4 Impossibile caricare come lexer o parser

Questa è la mia grammatica:

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 
    ; 

e questo è il mio build.xml di file:

<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

sarebbe utile se si potrebbe includere sia la grammatica o, se è piuttosto lungo, un [sscce] (http: // sscce.org) che dimostra il problema. Ciò aiuterà gli altri a diagnosticare più rapidamente il problema e potresti persino scoprirlo da solo. – ig0774

risposta

6

che sto riscrivendo la mia risposta in modo che sia più accurata.

Il motivo più probabile per cui non è possibile eseguire correttamente TestRig in NetBeans/antlrworks2 è perché si imposta la grammatica in un pacchetto diverso dal pacchetto predefinito. Se avete qualcosa di simile nella tua grammatica,

@header { 
    package org.whatever.troubles; 
} 

provare commentando fuori e in esecuzione "Run in TestRig ...". Dovrebbe funzionare in questo modo.

Sfortunatamente, la funzione "Esegui in TestRig ..." non consente di specificare un pacchetto. Dovrai mantenere la tua grammatica nel pacchetto predefinito o usare "grun" al prompt dei comandi.

Si consiglia di eseguire manualmente grun finché non viene risolto. Un buon modo per gestirlo è creare un file batch (run.bat) nella cartella di origine (dove si trova .g4). Verrà visualizzato in NetBeans nel riquadro Progetti in cui è possibile fare clic con il pulsante destro del mouse su di esso e selezionare "Esegui".

E, ancora, il vostro CLASSPATH deve essere accurata ...

Esempio run.bat contenuti:

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

Il costrutto '@header {package ...}' è obsoleto in ANTLR 4. Passare invece il flag '-package' al generatore di codice. –

+1

@ 280Z28 dovresti inviarlo come risposta. Grazie per le informazioni! –