gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:06:32 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com