首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR4:使用单独语法时的grun错误(ClassCastException)

ANTLR4:使用单独语法时的grun错误(ClassCastException)
EN

Stack Overflow用户
提问于 2019-01-24 23:08:10
回答 1查看 608关注 0票数 5

描述

我正在尝试创建一种自定义语言,以便将lexer规则从解析器规则中分离出来。此外,我的目标是将词汇规则和解析器规则进一步划分为特定的文件(例如,常见的词汇规则和关键字规则)。

但我似乎没办法让它起作用。

虽然在生成解析器(.java文件)时没有收到任何错误,但是grunException in thread "main" java.lang.ClassCastException中失败了。

备注

我正在针对Java在Windows7上运行ANTLR4.7.2

代码

我创建了一组文件,这些文件与我打算实现的目标非常相似。下面的示例定义了一种名为MyLang的语言,并分离了词法和解析器语法。另外,我将lexer规则分成四个文件:

  1. // MyLang.g4解析器语法MyLang;选项{ tokenVocab = MyLangL;} prog:( func )* END;func : DIR ID L_BRKT ( stat )* R_BRKT;stat: expr分号: OP_ASSIGN expr分号:分号分号;expr : expr运算符expr ID L_PAREN expr R_PAREN;
  2. // MyLangL.g4词法MyLangL;导入SkipWhitespaceL、CommonL、KeywordL;@header { package com.invensense.wiggler.lexer;} @ lexer ::members { //仅将该类成员放置在lexer Map关键字=新HashMap() { put("for",MyLangL.KW_FOR);/*在这里添加更多关键字*/ };} ID :a+{ if (keywords.containsKey(getText(){setType(keywords.get(getText();//重置令牌类型};
  3. // KeywordL.g4词法语法KeywordL;@ lexer ::header { //仅将此标头操作放在lexer中,而不是解析器导入java.util.*;} //显式定义关键字标记类型,以避免隐式def警告标记{ KW_FOR /*在这里添加更多关键字*/ }
  4. // CommonL.g4词法CommonL;编号:;浮点数: NEG?DIGIT+ '.‘DIGIT+ EXP;INT : NEG?UINT+;UINT : DIGIT+ EXP?;运算符: OP_ASSIGN而论:‘;L_PAREN:’;OP_ASSIGN:':=';OP_ADD : POS;OP_SUB : NEG;L_BRKT:'‘;R_BRKT:'’;L_PAREN:(‘;R_PAREN:’);分号:';‘;片段EXP : Ee符号?DIGIT+;片段符号: POS ~ NEG;片段POS:'+‘;片段序列:'-’;片段数字:0~9;
  5. // SkipWhitespaceL.g4语法SkipWhitespaceL;WS:\t\r\n+ ->通道(隐藏);

输出

下面是我从上面的代码中得到的确切输出:

代码语言:javascript
复制
ussjc-dd9vkc2 | C:\M\w\s\a\l\example
§ antlr4.bat .\MyLangL.g4

ussjc-dd9vkc2 | C:\M\w\s\a\l\example
§ antlr4.bat .\MyLang.g4

ussjc-dd9vkc2 | C:\M\w\s\a\l\example
§ javac *.java

ussjc-dd9vkc2 | C:\M\w\s\a\l\example
§ grun MyLang prog -tree
Exception in thread "main" java.lang.ClassCastException: class MyLang
        at java.lang.Class.asSubclass(Unknown Source)
        at org.antlr.v4.gui.TestRig.process(TestRig.java:135)
        at org.antlr.v4.gui.TestRig.main(TestRig.java:119)

ussjc-dd9vkc2 | C:\M\w\s\a\l\example
§
EN

回答 1

Stack Overflow用户

发布于 2019-04-23 10:01:10

使用MyLangParser和MyLangLexer重命名两个文件,然后运行grun MyLang prog -tree

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54356701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档