2013-01-31 8 views
5

Używam antlr 4 do napisania mojej gramatyki. Chciałbym zobaczyć wygenerowaną przez moją gramatykę trzy gui. Kiedy próbuję uruchomić przykład na stronie antlr (http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4) to działa, ale jeśli próbuję z moją gramatyką to nie działa. W szczególności próbowałem również uruchomić gramatykę w NetBeans i AntlrWorks 2 za pomocą polecenia "Run in TestRig ..", ale wynikiem jest ten sam komunikat o błędzie "" Nie można załadować Kłopotów jako lexer lub parser "".antlr 4 Nie można załadować jako lexer lub parser

To moja gramatyka:

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 
    ; 

i to jest mój plik 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

To byłoby pomocne, jeśli można to albo gramatykę lub, jeśli jest to dość długa, a [sscce] (http: // sscce.org), który demonstruje problem. Pomoże to innym szybciej zdiagnozować problem i może nawet odkryć go samodzielnie. – ig0774

Odpowiedz

6

mam przepisywanie moją odpowiedź tak, że jest bardziej dokładne.

Najbardziej prawdopodobnym powodem, dla którego nie można z powodzeniem uruchomić TestRig w NetBeans/antlrworks2, jest to, że ustawiłeś gramatykę na inną niż pakiet domyślny. Jeśli masz coś takiego w swojej gramatyce, spróbuj skomentować i uruchom "Uruchom w TestRig ...". To powinno działać w ten sposób.

Niestety, funkcja "Uruchom w TestRig ..." nie pozwala na określenie pakietu. Będziesz musiał zachować gramatykę w domyślnym pakiecie lub użyć polecenia "grun" w wierszu polecenia.

Zalecam uruchomienie grun ręcznie, dopóki nie zostanie naprawiony. Dobrym sposobem na zrobienie tego jest utworzenie pliku wsadowego (run.bat) w folderze źródłowym (gdzie znajduje się .g4). Pojawi się w NetBeans w okienku Projekty, gdzie można kliknąć prawym przyciskiem myszy i wybrać "uruchom".

I wciąż ścieżce klas muszą być dokładne ...

Przykład run.bat treści:

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

Konstrukcja '@header {package ...}' jest przestarzała w ANTLR 4. Przekaż flagę '-package' do generatora kodu. –

+1

@ 280Z28 należy podać jako odpowiedź. Dzięki za informację! –

Powiązane problemy