2013-01-31 9 views
5

Ich benutze Antlr 4, um meine Grammatik zu schreiben. Ich möchte die gui drei durch meine Grammatik erzeugt sehen. Wenn ich versuche, das Beispiel auf der Website Antlr (http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4) auszuführen, funktioniert es, aber wenn ich mit meiner Grammatik versuche, funktioniert es nicht. Insbesondere habe ich versucht, die Grammatik auf NetBeans und AntlrWorks 2 mit dem Befehl "Run in TestRig .." auszuführen, aber das Ergebnis ist die gleiche Fehlermeldung "" Probleme als Lexer oder Parser nicht laden "".antlr 4 Kann nicht als Lexer oder Parser geladen werden

Dies ist meine Grammatik:

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 
    ; 

und dies ist meine Datei 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

Es wäre hilfreich, wenn Sie entweder Ihre Grammatik oder enthalten könnte, wenn es ziemlich lang, ein [sscce] (http: // sscce.org), die das Problem demonstriert. Dies wird anderen helfen, das Problem schneller zu diagnostizieren und Sie können es sogar selbst entdecken. – ig0774

Antwort

6

ich meine Antwort bin Umschreiben, so dass es genauer ist.

Der wahrscheinlichste Grund, warum Sie TestRig in NetBeans/antlrworks2 nicht erfolgreich ausführen können, liegt darin, dass Sie Ihre Grammatik in einem anderen Paket als dem Standardpaket festlegen. Wenn Sie so etwas wie dies in der Grammatik,

@header { 
    package org.whatever.troubles; 
} 

probieren Sie es aus zu kommentieren und läuft „Run in TestRig ...“. Es sollte so funktionieren.

Leider können Sie mit der Funktion "In TestRig ausführen ..." kein Paket angeben. Sie müssen entweder Ihre Grammatik im Standardpaket behalten oder "grun" an der Eingabeaufforderung verwenden.

Ich empfehle grun manuell zu starten, bis dies behoben ist. Ein guter Weg, um damit umzugehen, ist eine Batch-Datei (run.bat) in Ihrem Quellordner (wo sich Ihre .g4 befindet) zu erstellen. Es wird in NetBeans im Bereich Projekte angezeigt, wo Sie mit der rechten Maustaste darauf klicken und "Ausführen" auswählen können.

Und noch CLASSPATH genau sein muss ...

Beispiel run.bat Inhalt:

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

Das Konstrukt '@header {package ...}' ist in ANTLR 4 veraltet. Übergeben Sie stattdessen das Flag '-package' an den Codegenerator. –

+1

@ 280Z28 sollten Sie das als Antwort einreichen. Danke für die Information! –

Verwandte Themen