2013-01-31 82 views
5

我正在使用antlr 4編寫我的語法。我想看看我的語法生成的gui三。 當我嘗試在antlr網站(http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4)上運行該示例時,它可以正常工作,但如果我嘗試使用我的語法,則不起作用。 特別是我也嘗試過使用命令「Run in TestRig ..」運行NetBeans和AntlrWorks 2上的語法,但結果是同樣的錯誤消息「」無法將Troubles加載爲詞法分析器或分析器「」。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:// sscce.org)證明了這個問題。這將幫助其他人更快地診斷問題,甚至可以在此過程中自己發現問題。 – ig0774

回答

6

我重寫我的答案,使其更加準確。

無法在NetBeans/antlrworks2中成功運行TestRig的最可能原因是因爲您將語法設置爲默認軟件包以外的軟件包。如果你在你的語法中有這樣的東西,

@header { 
    package org.whatever.troubles; 
} 

嘗試註釋它並運行「在TestRig中運行...」。它應該以這種方式工作。

不幸的是,「Run in TestRig ...」功能不允許你指定一個包。您必須將語法保留在默認包中,或者在命令提示符處使用「grun」。

我建議手動運行grun,直到它被修復。處理它的一個好方法是在你的源文件夾(你的.g4所在的位置)創建一個批處理文件(run.bat)。它將顯示在項目窗格中的NetBeans中,您可以右鍵單擊它並選擇「運行」。

而且,還是,你的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

在ANTLR 4中'@header {package ...}'結構已經過時。代替將'-package'標誌傳遞給代碼生成器。 –

+1

@ 280Z28你應該提交這個答案。謝謝(你的)信息! –

相關問題