簡體   English   中英

antlr 4無法作為詞法分析器或解析器加載

[英]antlr 4 Can't load as lexer or parser

我用antlr 4寫我的語法。 我想看看我的語法產生的gui三。 當我嘗試在antlr網站( http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4 )上運行該示例時,它可以工作,但如果我嘗試使用我的語法,它就不會不行。 特別是我還嘗試使用命令“Run in TestRig ..”在NetBeans和AntlrWorks 2上運行語法,但結果是相同的錯誤消息“”無法將問題加載為詞法分析器或解析器“”。

這是我的語法:

    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>

我正在重寫我的答案,以便更准確。

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

@header {
    package org.whatever.troubles;
}

嘗試將其評論並運行“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

這可能有點晚,但也許我可以幫助別人。 我打了一個TestRig版本來支持你可以在這里找到的軟件包:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM