草庐IT

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

coder 2024-03-29 原文

我正在使用 antlr 4 编写我的语法。我想看看我的语法生成的gui 3。 当我尝试在 antlr 站点 ( http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4 ) 上运行该示例时,它可以运行,但是如果我尝试使用我的语法,它就无法运行。 特别是,我还尝试使用命令“Run in TestRig..”在 NetBeans 和 AntlrWorks 2 上运行语法,但结果是相同的错误消息““无法加载 Troubles as lexer or parser”。

这是我的语法:

    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;
}

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

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

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

而且,您的 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

关于java - antlr 4 无法作为词法分析器或解析器加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14630154/

有关java - antlr 4 无法作为词法分析器或解析器加载的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  3. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  4. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  5. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  6. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  7. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  8. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  9. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  10. ruby - 无法覆盖 irb 中的 to_s - 2

    我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)

随机推荐