[英]Running `TestRig` on separated grammer and lexer results in `java.lang.ClassCastException` or `Can't load Test as lexer or parser`
[英]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版本來支持你可以在這里找到的軟件包:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.