简体   繁体   English

antlr 4无法作为词法分析器或解析器加载

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

I'm using antlr 4 to write my grammar. 我用antlr 4写我的语法。 I would like to see the gui three generated by my grammar. 我想看看我的语法产生的gui三。 When I try to run the example on the antlr site ( http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4 ) it works, but if I try with my grammar it doesn't work. 当我尝试在antlr网站( http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4 )上运行该示例时,它可以工作,但如果我尝试使用我的语法,它就不会不行。 In particular I've tried also to run the grammar on NetBeans and AntlrWorks 2 with the command "Run in TestRig.." , but the result is the same error message ""Can't load Troubles as lexer or parser"". 特别是我还尝试使用命令“Run in TestRig ..”在NetBeans和AntlrWorks 2上运行语法,但结果是相同的错误消息“”无法将问题加载为词法分析器或解析器“”。

This is my grammar: 这是我的语法:

    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
    ;

and this is my file build.xml: 这是我的文件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>

I'm rewriting my answer so that it is more accurate. 我正在重写我的答案,以便更准确。

The most likely reason you can't successfully run TestRig in NetBeans/antlrworks2 is because you set your grammar to be in a package other than the default package. 您无法在NetBeans / antlrworks2中成功运行TestRig的最可能原因是您将语法设置为默认包以外的包。 If you have something like this in your grammar, 如果你的语法中有这样的东西,

@header {
    package org.whatever.troubles;
}

try commenting it out and running "Run in TestRig...". 尝试将其评论并运行“Run in TestRig ...”。 It should work this way. 它应该这样工作。

Unfortunately, the "Run in TestRig..." feature does not allow you to specify a package. 不幸的是,“Run in TestRig ...”功能不允许您指定包。 You'll have to either keep your grammar in the default package, or use "grun" at the command prompt. 您必须将语法保留在默认包中,或者在命令提示符下使用“grun”。

I recommend running grun manually until this is fixed. 我建议手动运行grun,直到修复为止。 A nice way to handle it is to create a batch file (run.bat) in your source folder (where your .g4 is). 处理它的一个好方法是在源文件夹(.g4所在的位置)中创建批处理文件(run.bat)。 It will show up in NetBeans in the Projects pane where you can right-click on it and select "run". 它将显示在“项目”窗格中的NetBeans中,您可以在其中右键单击它并选择“运行”。

And, still, your CLASSPATH must be accurate... 而且,你的CLASSPATH必须准确......

Example run.bat contents: 示例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

It might be a bit late but maybe I can help others. 这可能有点晚,但也许我可以帮助别人。 I patched a version of TestRig to support packages which you can find here: 我打了一个TestRig版本来支持你可以在这里找到的软件包:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在分离的语法和词法分析器上运行`TestRig`导致`java.lang.ClassCastException`或`无法将测试加载为词法分析器或解析器 - Running `TestRig` on separated grammer and lexer results in `java.lang.ClassCastException` or `Can't load Test as lexer or parser` Antlr在词法分析器内部使用解析器 - Antlr Using Parser Inside A Lexer antlr 词法分析器和解析器的转义字符 - Escape characters for an antlr lexer and parser 如何在JVM上执行它? (带有Antlr的Lexer和Parser) - How Execute it On JVM ? (Lexer & Parser with Antlr) 解决ANTLR4中的Lexer和Parser歧义 - Resolving Lexer and Parser ambiguities in ANTLR4 此ANTLR 4 Lexer文件中的“语法分析器不允许使用解析器规则&#39;通道&#39;”错误是什么? - What is “parser rule 'channels' not allowed in lexer” error in this ANTLR 4 Lexer file? 我可以使用Antlr创建的词法分析器/解析器来解析PDDL文件并将数据返回给Java程序吗? - Can I use an Antlr created lexer/parser to parse PDDL file and return data to a Java program? 如何使用ANTLR词法分析器和解析器编写MIN MAX操作? - How to write MIN MAX operation using ANTLR lexer and parser? Antlr解析器规则无法匹配任何指定的词法分析器规则 - Antlr parser rule fails to match either of specified lexer rules 向antlr4中的Lexer / Parser文件添加自定义异常的正确方法 - Correct way to add custom exception to Lexer/Parser files in antlr4
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM