2013-01-31 5 views
5

私はantlr 4を使用して文法を書いています。私は私の文法によって生成されたGUI 3を見たいと思います。 antlrサイト(http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4)でサンプルを実行しようとすると動作しますが、私の文法で試しても動作しません。 特に、NetBeansとAntlrWorks 2で "Run in TestRig .."コマンドで文法を実行しようとしましたが、結果が同じエラーメッセージ ""レクサーまたはパーサーとしてトラブルを読み込めません。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

はそれが役立つだろう:私はあなたがここに見つけることができるパッケージをサポートするためにTestRigのバージョンにパッチを当て// sscce.org)を参照してください。これは、他の人が問題をより迅速に診断するのに役立ち、プロセス中で自分自身で発見することさえできます。 – ig0774

答えて

6

それがより正確であるように、私は私の答えを書き換えています。

NetBeans/antlrworks2でTestRigを正常に実行できないのは、文法をデフォルトパッケージ以外のパッケージに設定しているためです。文法にこのようなことがある場合は、「Run in 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

'@header {package ...}'構造体はANTLRでは廃止されました。4.代わりに '-package'フラグをコードジェネレータに渡してください。 –

+1

@ 280Z28あなたは答えとしてそれを提出しなければなりません。情報をありがとう! –

1

それは少し遅れがあるかもしれないが、多分私は他の人を助けることができます。あなたの文法や、それはかなり長いです場合、[sscce](HTTPのいずれかを含めることができれば

https://gist.github.com/bysse/2fc674a040a92a447c31

関連する問題