2013-01-31 24 views
5

Tôi đang sử dụng antlr 4 để viết ngữ pháp của mình. Tôi muốn thấy ba gui được tạo ra bởi ngữ pháp của tôi. Khi tôi cố gắng chạy ví dụ trên trang web antlr (http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4) nó hoạt động, nhưng nếu tôi thử với ngữ pháp của tôi nó không hoạt động. Đặc biệt, tôi cũng đã thử chạy ngữ pháp trên NetBeans và AntlrWorks 2 với lệnh "Chạy trong TestRig ..", nhưng kết quả là cùng một thông báo lỗi "" Không thể tải Troubles dưới dạng lexer hoặc phân tích cú pháp "".antlr 4 Không thể tải dưới dạng lexer hoặc phân tích cú pháp

Đây là ngữ pháp của tôi:

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 
    ; 

và đây là build.xml tập tin của tôi:

<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

Nó sẽ rất hữu ích nếu bạn có thể bao gồm cả ngữ pháp của bạn, hoặc nếu nó khá dài, một [sscce] (http: // sscce.org) minh họa vấn đề. Điều này sẽ giúp người khác nhanh chóng chẩn đoán vấn đề hơn và thậm chí bạn có thể tự khám phá ra nó trong quá trình này. – ig0774

Trả lời

6

Tôi viết lại câu trả lời của tôi để nó là chính xác hơn.

Lý do rất có thể bạn không thể chạy TestRig thành công trong NetBeans/antlrworks2 là vì bạn đặt ngữ pháp của mình thành gói không phải gói mặc định. Nếu bạn có nội dung như thế này trong ngữ pháp của mình,

@header { 
    package org.whatever.troubles; 
} 

hãy thử nhận xét và chạy "Chạy trong TestRig ...". Nó sẽ hoạt động theo cách này.

Thật không may, tính năng "Chạy trong TestRig ..." không cho phép bạn chỉ định gói. Bạn sẽ phải giữ ngữ pháp của bạn trong gói mặc định hoặc sử dụng "grun" tại dấu nhắc lệnh.

Tôi khuyên bạn nên chạy grun theo cách thủ công cho đến khi điều này được khắc phục. Cách tốt nhất để xử lý nó là tạo một tệp batch (run.bat) trong thư mục nguồn của bạn (nơi .g4 của bạn). Nó sẽ hiển thị trong NetBeans trong cửa sổ Projects, nơi bạn có thể nhấp chuột phải vào nó và chọn "run".

Và, vẫn còn, CLASSPATH của bạn phải chính xác ...

Ví dụ run.bat nội dung:

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

Cấu trúc '@header {package ...}' đã lỗi thời trong ANTLR 4. Chuyển cờ '-package' đến trình tạo mã thay thế. –

+1

@ 280Z28 bạn nên gửi câu trả lời đó. Cảm ơn bạn về thông tin! –

Các vấn đề liên quan