Antlr 外部输入

2023-12-28

我有一个语法文件 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}

要解析的文件:

板名称=按键板重力=5.0 摩擦力1=0.0 摩擦力2=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令牌:这就是问题所在。

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

  1. 匹配消耗最多字符的规则
  2. 如果有多个规则匹配相同数量的字符,则选择第一个定义的规则

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

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

a NAME令牌将在大多数之前创建KEY替代方案,以及所有KEYPRESS将创建替代方案。

并且自从INT匹配一位或多位数字并在之前定义KEY它也有一个单位数字的替代,很明显,词法分析器永远不会产生一个KEY or KEYPRESS token.

如果您移动NAME and INT规则低于KEY and KEYPRESS规则,那么大多数令牌将按照您的预期构建,这是我的猜测。

EDIT

一个可能的解决方案如下:

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]+ ;

IE。我删除了[0-9]替代方案KEY并介绍了一个SINGLE_DIGIT规则(放置在before the INT rule!).

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

integer : INT | SINGLE_DIGIT ;

key : KEY | SINGLE_DIGIT ;

并更改所有出现的INT内部解析器规则integer(不要称你的规则为int:这是一个保留字)并更改所有KEY to key.

你可能还想做类似的事情NAME[a-z]替代方案KEY(即单个小写字符现在永远不会被标记为NAME,始终作为KEY).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Antlr 外部输入 的相关文章

  • 为 JSP 创建注销链接?

    当用户登录我的应用程序时 他提交一个要通过 Servlet 处理的表单 servlet 为用户创建一个会话 我如何创建一个链接以便用户可以注销 我似乎无法直接链接到 Servlet 如何删除会话并链接回主页 HttpSession sess
  • 从 Windows Batch (cmd.exe) 中的文件读取环境变量

    我正在尝试从批处理文件中读取变量 以便稍后在批处理脚本 Java 启动器 中使用 理想情况下 我希望所有平台 Unix Windows 上的设置文件都具有相同的格式 并且也是有效的 Java 属性文件 也就是说 它应该看起来像这样 sett
  • .NET 世界有 Maven 替代方案或端口吗?

    NET 世界有 Maven 替代方案或端口吗 我很想使用 Java 世界拥有的良好依赖管理系统 但我没有找到任何可与 NET 项目相媲美的系统 NMaven http incubator apache org nmaven 是第一个 官方努
  • rmi类找不到异常

    我使用 java rmi 编写了一个简单的项目并导出到可执行 jar 文件 当我尝试运行它时 有时会出现异常 有时会起作用 当我指定 Djava rmi server codebase file serverClasses 时 它似乎没有正
  • Runtime.getRuntime().exec(cmd) 挂起

    我正在执行一个命令 该命令返回文件的修订号 文件名 但如果执行命令时出现问题 应用程序就会挂起 我可以做什么来避免这种情况 请在下面找到我的代码 String cmd cmd C si viewhistory fields revision
  • 控制启动时的竞争条件

    我有一些代码想要执行一些一次性初始化 但这段代码没有明确的生命周期 因此在初始化完成之前 我的逻辑可能会被多个线程调用 所以 我想基本上确保我的逻辑代码 等待 直到初始化完成 这是我的第一次剪辑 public class MyClass p
  • 无法从 PDFA1-a 格式文档中提取图像

    我正在使用以下代码从 PDFA1 a 格式的 pdf 中提取图像 但我无法获取图像 List
  • 如何使用 Java 文档 API 为 OrientDB 数据库创建自动递增索引/序列?

    我通过其文档 API 将 OrientDB 与 Java 结合使用 我有一个简单的类叫做items它有一个属性ID 我明确声明架构如下 OSchema schema db getMetadata getSchema OClass items
  • 当我打印出数组列表的索引时如何删除最后一个逗号[重复]

    这个问题在这里已经有答案了 List
  • 不带破折号的 CliBuilder 参数

    使用 Groovy CliBuilder 理想情况下我希望有一个命令行 如下所示 MyProgram groovy CommandName arg1 arg2 arg3 是否可以使用 CliBuilder 解析提取 CommandName
  • 使用 JPA 标准的“不在”约束

    我正在尝试写一个NOT IN约束使用JPA Criteria 我尝试过这样的事情 builder not builder in root get property1 虽然我知道这行不通 在上面的语法中 如何添加集合 列表property1会
  • 错误:类 kotlin.reflect.jvm.internal.FunctionCaller$FieldSetter

    我已尝试一切方法来消除此错误 但它不断出现 Class kotlin reflect jvm internal FunctionCaller FieldSetter can not access a member of class com
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • 何时对字符串文字使用 intern()

    我看到很多这样的遗留代码 class A public static final String CONSTANT value intern 我看不出使用 intern 的任何原因 因为在 Javadoc 中可以读到 所有文字字符串和字符串值
  • Android Studio错误的含义:未注释的参数覆盖@NonNull参数

    我正在尝试 Android Studio 创建新项目并添加默认值后onSaveInstanceState方法创建 MyActivity 类 当我尝试将代码提交到 Git 时 我收到一个我不明白的奇怪错误 代码是这样的 我得到的错误是这样的
  • 不支持使用 JDK 版本“11.0.1”进行构建。请安装 JDK 版本 `1.8.0`

    我已经下载了 Visual Studio for Mac 并尝试开始学习 Xamarin iOS 和 Android 问题是当我尝试运行 android 项目时出现以下错误 Building with JDK Version 11 0 1
  • 尝试用Java实现基于文本的Hangman游戏

    我需要检查用户输入的字母以及他们猜测的空格是否位于隐藏单词的特定位置 变量one等于用户猜测的空间索引 而letterGuess是他们猜测的字母 我的代码怎么错了 示例 秘密词是你好 hidden word is 用户猜测h 0 1 2 3
  • 在服务器上创建 Zip 文件并使用 java 下载该 zip

    我从 mkyong 获得了以下代码 用于在本地压缩文件 但是 我的要求是在服务器上压缩文件并需要下载它 任何人都可以帮忙吗 代码写入zip文件 public void zipFiles File contentFile File navFi
  • 不幸的是 Project_Name 已停止

    我有一个简单的应用程序 您可以在文本视图中输入文本并按提交 它会在另一个活动中显示文本 然而 当我按下提交时 给我消息 不幸的是 发送已停止 我查看了SO上的其他线程 但是不幸的是 myfirstproject 在 java 中停止工作错误
  • Java编程编译jar

    我有一个文本文件中的java源代码 必须在源代码中输入一些自定义的硬编码变量 然后将其转换为 jar 这是可行的 但是当我运行 jar 时 找不到 Main 类 当我用 WinRAR 解压 jar 文件时 我似乎找不到错误 当我通过 cmd

随机推荐

  • 设置子进程中共享 c_char_p 中字符串的值?

    我有这样的情况 主进程生成一些子进程 它们应该将结果写入字符串和数字类型的共享对象中 对于数字类型没有问题 但对于字符串 值将丢失 import multiprocessing as mp from ctypes import Struct
  • 如何获取项目中所有功能的列表?

    我想以编程方式提取 Google Apps 项目中所有功能的列表 任何服务中似乎都没有一种方法可以轻松提取它们 除非它似乎以某种方式存储在 this 函数中 最好的方法是什么 您想要检索函数列表 您希望使用 Google Apps 脚本来实
  • scipy 成对距离和 X.X+Y.Y - X.Y^t 之间的差异

    假设我们的数据为 d1 np random uniform low 0 high 2 size 3 2 d2 np random uniform low 3 high 5 size 3 2 X np vstack d1 d2 X array
  • “.T”对于 Numpy 数组意味着什么?

    我在 SciPy 文档中看到了这个例子 x y np random multivariate normal mean cov 5000 T 最后的 T 实际上在这里做什么 The T访问属性T对象的 它恰好是一个 NumPy 数组 这T属性
  • 多个新元素的角度交错动画

    我正在尝试在列表中添加交错动画 到目前为止 我已经成功地加载了交错动画 除了加载之外 我还希望在将新项目添加到数组时触发交错动画 我按照这个例子 https medium com google developer experts angul
  • InnoSetup:如何在组件描述中添加换行符

    我正在尝试在组件的描述中间添加换行符 但我似乎找不到合适的语法 Components Name Component A Description This is component A NewLine My component A has t
  • matlab函数sum()的奇怪行为

    知道为什么 Matlab 会这样吗 gt gt sum 0 0 0 Subscript indices must either be real positive integers or logicals gt gt sum 1 1 1 an
  • Xcode Interface Builder - 删除/重命名错误接线的 IBOutlets / IBActions 的“正确”方法?

    我是 Xcode 新手 使用 Swift 工作 所以我不确定我所描述的是否实际上是一个错误 使用界面生成器和助理编辑器时 我可以创建标签 按钮等 并通过按住 Control 键拖动在代码中创建 Outlet 和 Action 只要我是完美的
  • Drools:在数据库中存储规则

    目前 我将所有规则文件存储在文件系统上 它们有很多版本 并在启动时将它们的不同版本加载到内存中 我想更改为将我的 drools 文件存储在数据库中 并且想知道 Drools 是否有任何解决方案或插件可以促进这一点 或者我应该自己制作 Tha
  • 如何在没有 JavaScript 的情况下仅使用内联 CSS 创建工具提示?

    我正在尝试使用内联 CSS 创建悬停工具提示 而不使用 JavaScript 这是我现在的代码 a href hover text span style background color black color white span a
  • 以 JSON 形式提交表单(无 AJAX)

    是否可以在不使用 AJAX 的情况下以 JSON 形式提交表单数据 我尝试更改 enctype
  • Youtube API 返回当前时间

    我正在使用 youtube iframe api 似乎无法在文档或 google 上找到任何引用如何获取当前媒体完成时的返回值的内容 我需要构建一个脚本 可以在其中传递时间变量 其中当变量与当前播放时间匹配时可以触发事件 我知道在嵌入 AP
  • 如何在 R 中导出/导入向量?

    我意识到这是一个非常基本的问题 但我想确保我做得正确 所以我想问只是为了确认 我在一个项目中有一个向量 我希望能够在另一个项目中使用它 我想知道是否有一种简单的方法可以以一种可以轻松将其导入到另一个项目的形式导出该向量 到目前为止 我想出的
  • 从 jquery 通过 AJAX 发送图像数据

    我需要使用 AJAX 将图像数据 data image png base64 从客户端发送到我的 PHP 服务器 我的 AJAX 调用如下所示 表单数据包含图像 ajax url global siteurl save image data
  • 捆绑 git 存储库而不克隆它

    如何捆绑 git 项目而不需要每次都克隆它 现在我总是执行下面的命令 git clone mirror http git project cd git project git bundle create git project lock a
  • selectInput 值未在可反应的 Shiny 中更新(麻烦绑定-unbiding)

    我在 Shiny 的可反应内部有一个 selecInput 但输入没有更新 我想做这样的事情 但可以反应 绑定 取消绑定 DataTable 时出现反应问题 https stackoverflow com questions 3757203
  • 来自 AngularJS 的 Django CORS API

    我已经在 Django 中使用 django cors 启用了 CORS https github com ottoyiu django cors headers https github com ottoyiu django cors h
  • Numpy - 多个外积

    我想知道是否有一种方法可以计算多个外部产品并将结果堆叠在单个操作中 假设我有一个 Nx1 向量并与 1xM 向量进行外积 结果将是一个 NxM 矩阵 如果我有一个 NxR 矩阵 A 和一个 RxM 矩阵 B 会怎么样 是否可以构造一个 Nx
  • .NET 中的类数量?

    NET 中的类总数是多少 那个数字 位于下载的 NET 2 0 NET 3 0 和 NET 运行时中 3 5 SP1 我们正在写一篇关于应用程序的科学论文 基于 NET 目前声明还有更多 超过6000个班级 但我不确定这是否正确 数字 例如
  • Antlr 外部输入

    我有一个语法文件 BoardFile g4 其中包含 仅相关部分 grammar Board Tokens GADGET squareBumper circleBumper triangleBumper leftFlipper rightF