我有一个语法文件BoardFile.g4(只有相关部分):
grammar Board;

//Tokens
GADGET : 'squareBumper' | 'circleBumper' | 'triangleBumper' | 'leftFlipper' | 'rightFlipper' | 'absorber' | 'portal' ;
NAME : [A-Za-z_][A-Za-z_0-9]* ;
INT : [0-9]+ ;
FLOAT : '-'?[0-9]+('.'[0-9]+)? ;
COMMENT : '#' ~( '\r' | '\n' )*;
WHITESPACE : [ \t\r\n]+ -> skip ;
KEY : [a-z] | [0-9] | 'shift' | 'ctrl' | 'alt' | 'Meta' | 'space' | 'left' | 'right' | 'up' | 'down' | 'minus' | 'equals' | 'backspace' | 'openbracket' | 'closebracket' | 'backslash' | 'semicolon' | 'quote' | 'enter' | 'comma' | 'period' | 'slash' ;
KEYPRESS : 'keyup' | 'keydown' ;

//Rules
file : define+ EOF ;
define : board | ball | gadget | fire | COMMENT | key ;
board : 'board' 'name' '=' name ('gravity' '=' gravity)? ('friction1' '=' friction1)? ('friction2' '=' friction2)? ;
ball : 'ball' 'name' '=' name 'x' '=' xfloat 'y' '=' yfloat 'xVeLocity' '=' xvel 'yVeLocity' '=' yvel ;
gadget : gadgettype 'name' '=' name 'x' '=' xint 'y' '=' yint ('width' '=' width 'height' '=' height)? ('orientation' '=' orientation)? ('otherBoard' '=' name 'otherPortal' '=' name)? ;
fire : 'fire' 'trigger' '=' trigger 'action' '=' action ;
key : keytype 'key' '=' KEY 'action' '=' name ;

name : NAME ;
gadgettype : GADGET ;
keytype : KEYPRESS ;
gravity : FLOAT ;
friction1 : FLOAT ;
friction2 : FLOAT ;
trigger : NAME ;
action : NAME ;
yfloat : FLOAT ;
xfloat : FLOAT ;
yint : INT ;
xint : INT ;
xvel : FLOAT ;
yvel : FLOAT ;
orientation : INT ;
width : INT ;
height : INT ;

这会生成词法分析器和解析器.但是,当我对以下文件使用它时,它会给出以下错误:

line 12:0 extraneous input 'keyup' expecting {<EOF>,KEYPRESS}

文件到解析:

board name = keysBoard gravity = 5.0 friction1 = 0.0 friction2 = 0.0

# define a ball
ball name=Ball x=0.5 y=0.5 xVeLocity=2.5 yVeLocity=2.5

# add some flippers
leftFlipper name=FlipL1 x=16 y=2 orientation=0
leftFlipper name=FlipL2 x=16 y=9 orientation=0

# add keys. lots of keys.
keyup key=space action=apple
keydown key=a action=ball
keyup key=backslash action=cat
keydown key=period action=dog

我在SO中经历了有关此错误的其他问题,但没有人帮助我.我无法弄清楚出了什么问题.为什么我收到此错误?

解决方法

字符串“keyup”被标记为NAME标记:这就是问题所在.

您必须意识到词法分析器独立于解析器运行.如果解析器尝试匹配KEYPRESS令牌,则词法分析器不会“监听”它,而只是按照规则构造一个令牌:

>匹配消耗最多字符的规则
>如果有更多规则匹配相同数量的字符,请选择首先定义的规则

考虑这些规则,以及规则的顺序:

NAME : [A-Za-z_][A-Za-z_0-9]* ;

INT : [0-9]+ ;

KEY : [a-z] | [0-9] | 'shift' | 'ctrl' | 'alt' | 'Meta' | 'space' | 'left' | 'right' | 'up' | 'down' | 'minus' | 'equals' | 'backspace' | 'openbracket' | 'closebracket' | 'backslash' | 'semicolon' | 'quote' | 'enter' | 'comma' | 'period' | 'slash' ;

KEYPRESS : 'keyup' | 'keydown' ;

将在大多数KEY备选项之前创建NAME令牌,并且将创建所有KEYPRESS备选项.

并且由于INT匹配一个或多个数字并且在KEY之前定义并且还具有单个数字替代,因此很明显词法分析器将永远不会产生KEY或KEYPRESS令牌.

如果您将NAME和INT规则移动到KEY和KEYPRESS规则下面,那么大多数令牌将按照您的预期构建,这是我的猜测.

编辑

可能的解决方案如下:

KEY : [a-z] | 'shift' | 'ctrl' | 'alt' | 'Meta' | 'space' | 'left' | 'right' | 'up' | 'down' | 'minus' | 'equals' | 'backspace' | 'openbracket' | 'closebracket' | 'backslash' | 'semicolon' | 'quote' | 'enter' | 'comma' | 'period' | 'slash' ;

KEYPRESS : 'keyup' | 'keydown' ;

NAME : [A-Za-z_][A-Za-z_0-9]* ;

SINGLE_DIGIT : [0-9] ;

INT : [0-9]+ ;

即我从KEY中删除了[0-9]替代,并引入了一个SINGLE_DIGIT规则(放在INT规则之前!).

现在创建一些额外的解析器规则:

integer : INT | SINGLE_DIGIT ;

key : KEY | SINGLE_DIGIT ;

并将解析器规则中所有出现的INT更改为整数(不要调用您的规则int:它是保留字)并将所有KEY更改为key.

而且你可能也想做类似于NAME和KEY中的[a-z]替代方法(即单个小写字符现在永远不会被标记为NAME,总是作为KEY).

java – Antlr无关输入的更多相关文章

  1. 【swift】15-0520 字典

    字典.count()字典.isEmpty字典[key]=value//增加一个值字典[key]=value2//修改一个值字典.updateValue//返回一个optional类型的值,需要更新的key不存在则更新失败,所以一般用if语句进行判断,if字典.updateValue{println}else{println}用binding显示出值。iflet常量=字典.updateValue{println(“”)}else{println(“”)}显示字典中所有的键值对:forin字典{println

  2. Swift-字典

  3. Swift 字典的常用方法

    /***要正确使用字典,也需要一些条件*1,字典键值对的键和值的类型必须明确,可以直接指定,也可以类似数组直接赋值由编译器自动识别*2,字典必须要初始化*3,键的类型必须是可以被哈希Hashable的**///字典的几种声明方式常用方法见下方代码苹果开发群:414319235欢迎加入欢迎讨论

  4. swift 2.0 字典

    //6.字典---的特点:无序性这个无序性是指字典内部存放的元素顺序跟我们定义时写的元素顺序是没有对应的,但是实质上,字典内部的元素是有序的。),至于为什么,之后会有专门的解说。//并且,字典的key值是唯一的,不能重复。

  5. swift * 字典/Dictionary初始化以及增、删、改、遍历

    学习笔记1、字典初始化vardict=[:]//初始化无类型空字典dict=["1":"aaa","2":"bbb"]print(dict)dict=[1:"1","2":2]//key和value都是不定类型的print(dict)letdict2:Dictionary=["1":111,"2":222]//限定键值类型print(dict2)letdict3:[Stri

  6. Swift基础学习2

    1.数组的创建及操作2.Range的创建3.Dictionary的创建及操作4.func5.闭包

  7. swift dictionary 是否存在key

  8. 是否应该使用可选映射?

    和之前使用可选映射的功能并无区别,但是意义上更加清晰了。略微有点可选映射能够有效避免可能发生的错误吗?有可能,但是也可能带来问题可选映射能够更好地表达编程的思路吗?对于我来说不,但是有可能让那些理解「映射」和「可选值」的人来说是使用可选映射维护代码能变简单吗?

  9. Swift NSKeyedArchiver

    1.在带键的归档中,每个归档字段都有一个key值,解归档时key值要与归档时key值匹配2.带键归档可以一次存储多个对象3.归档的对象是Foundation框架中的对象4.归档和解归档其中任意对象都需要归档和解归档整个文件5.归档后的文件是加密的,所以归档文件的扩展名可以随意取

  10. swift中dictionary字典的使用

    Swift字典用来存储无序的相同类型数据的集合,Swift字典会强制检测元素的类型,如果类型不同则会报错。和数组中的数据项不同,字典中的数据项并没有具体顺序。Swift字典的key没有类型限制可以是整型或字符串,但必须是唯一的。这意味着在创建字典后,可以通过添加、删除、修改的方式改变字典里的项目。如果将一个字典赋值给常量,字典就不可修改,并且字典的大小和内容都不可以修改。

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部