6

我正在使用 antlr 4 来编写我的语法。我想看看我的语法生成的gui三。当我尝试在 antlr 站点(http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4)上运行该示例时,它可以工作,但如果我尝试使用我的语法它不会不行。特别是,我还尝试使用“在 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>
4

2 回答 2

8

我正在重写我的答案,以便更准确。

您无法在 NetBeans/antlrworks2 中成功运行 TestRig 的最可能原因是您将语法设置为在默认包以外的包中。如果你的语法中有这样的东西,

@header {
    package org.whatever.troubles;
}

尝试将其注释掉并运行“在 TestRig 中运行...”。它应该以这种方式工作。

不幸的是,“在 TestRig 中运行...”功能不允许您指定包。您必须将语法保留在默认包中,或者在命令提示符下使用“grun”。

我建议手动运行 grun 直到这个问题得到解决。处理它的一个好方法是在源文件夹(.g4 所在的位置)中创建一个批处理文件(run.bat)。它将显示在 NetBeans 的 Projects 窗格中,您可以在其中右键单击它并选择“运行”。

而且,您的 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
于 2013-02-12T03:17:15.913 回答
1

可能有点晚了,但也许我可以帮助别人。我修补了一个版本的 TestRig 以支持您可以在此处找到的软件包:

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

于 2014-09-24T15:18:18.253 回答