Antlr左递归问题

2023-12-01

我的 Antlr 语法中存在左递归问题。虽然我认为我理解为什么会出现问题,但我无法想出解决方案。问题出在我的数据类型规则的最后一行。我已经包含了完整的语法供您查看:

grammar Test;

options {output=AST;ASTLabelType=CommonTree;}
tokens {FUNCTION; ATTRIBUTES; CHILDREN; COMPOSITE;}

program     :   function ;
function    :   ID (OPEN_BRACKET (attribute (COMMA? attribute)*)? CLOSE_BRACKET)? (OPEN_BRACE function* CLOSE_BRACE)? SEMICOLON? -> ^(FUNCTION ID ^(ATTRIBUTES attribute*) ^(CHILDREN function*)) ;

attribute   :   ID (COLON | EQUALS)  datatype -> ^(ID datatype);

datatype    :   ID      ->  ^(STRING["id"] ID)
            |   NUMBER  ->  ^(STRING["number"] NUMBER)
            |   STRING  ->  ^(STRING["string"] STRING)
            |   BOOLEAN ->  ^(STRING["boolean"] BOOLEAN)
            |   array   ->  ^(STRING["array"] array)
            |   lookup  ->  ^(STRING["lookup"] lookup)
            |   datatype PLUS datatype -> ^(COMPOSITE datatype datatype) ;

array       :   OPEN_BOX (datatype (COMMA datatype)*)? CLOSE_BOX -> datatype* ;
lookup      :   OPEN_BRACE (ID (PERIOD ID)*) CLOSE_BRACE -> ID* ;

NUMBER
    :   ('+' | '-')? (INTEGER | FLOAT)
    ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

BOOLEAN
    :   'true' | 'TRUE' | 'false' | 'FALSE'
    ;

ID  :   (LETTER|'_') (LETTER | INTEGER |'_')*
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WHITESPACE  :   (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ;

COLON   :   ':' ;
SEMICOLON   :   ';' ;

COMMA   :   ',' ;
PERIOD  :   '.' ;
PLUS    :   '+' ;
EQUALS  :   '=' ;   

OPEN_BRACKET    :   '(' ;
CLOSE_BRACKET   :   ')' ;

OPEN_BRACE  :   '{' ;   
CLOSE_BRACE :   '}' ;

OPEN_BOX    :   '[' ;
CLOSE_BOX   :   ']' ;

fragment
LETTER
    :   'a'..'z' | 'A'..'Z' 
    ;

fragment
INTEGER
    :   '0'..'9'+
    ;

fragment
FLOAT
    :   INTEGER+ '.' INTEGER*
    ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    ;

我正在使用 Antlr 进行开发,它提供了解决此问题的功能 - 但不幸的是它似乎不起作用:s

任何帮助都会很棒。

Thanks.

EDIT:

这是我试图实现/解析的语言的示例

<FunctionName> <OptionalAttributes> <OptionalChildFunctions>

例如:

ForEach(in:[1,2,3,4,5] as:"i") {
  Switch(value:{i}) {
    Case(value:3) {
      Print(message:"This is the number 3")
    }

    Default {
       Print(message:"This isn't the number 3")
    }
 }
}

好的,这应该可以解决问题:

grammar Test;

/************************************** PARSER **************************************/
program
    :   function EOF 
    ;

function
    :   ID (OPEN_PAREN (attribute (COMMA attribute)*)? CLOSE_PAREN)?
        (OPEN_BRACE function* CLOSE_BRACE)?
        SEMICOLON?
    ;

attribute
    :   ID (COLON | EQUALS)? expression
    ;

expression
    :   atom (PLUS atom)*
    ;

atom
    :   ID
    |   STRING
    |   BOOLEAN
    |   NUMBER
    |   array
    |   lookup
    ;

array
    :   OPEN_BOX (expression (COMMA expression)*)? CLOSE_BOX
    ;

lookup
    :   OPEN_BRACE (ID (PERIOD ID)*) CLOSE_BRACE
    ;

/************************************** LEXER **************************************/
NUMBER          :   ('+' | '-')? (INTEGER | FLOAT)
                ;

STRING          :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
                ;

BOOLEAN         :   'true' | 'TRUE' | 'false' | 'FALSE'
                ;

ID              :   (LETTER|'_') (LETTER | INTEGER |'_')*
                ;

COMMENT         :   '//' ~('\n'|'\r')* ('\r'? '\n'| EOF) {$channel=HIDDEN;}
                |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
                ;

WHITESPACE      :   (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ;

COLON           :   ':' ;
SEMICOLON       :   ';' ;

COMMA           :   ',' ;
PERIOD          :   '.' ;
PLUS            :   '+' ;
EQUALS          :   '=' ;   

OPEN_PAREN      :   '(' ;
CLOSE_PAREN     :   ')' ;

OPEN_BRACE      :   '{' ;   
CLOSE_BRACE     :   '}' ;

OPEN_BOX        :   '[' ;
CLOSE_BOX       :   ']' ;

fragment 
LETTER          :   'a'..'z' | 'A'..'Z' ;
fragment
INTEGER         :   '0'..'9'+ ;
fragment
FLOAT           :   INTEGER+ '.' INTEGER* ;
fragment
ESC_SEQ         :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') ;

请注意,我已更改名称OPEN_BRACKET and CLOSE_BRACKET into OPEN_PAREN and CLOSE_PAREN。圆形的,( and ), 是括号,方括号,[ and ],被称为方括号(你称之为盒子的那些,但在我看来,称它们为盒子并没有什么坏处)。

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

Antlr左递归问题 的相关文章

  • C++递归求数组最小值

    我有一个 C 编程类的作业 要求编写一个不使用静态变量的递归函数 原型如下 int findmin const int a int n 我的解决方案有效 对于非常小的数组 但是我认为 2 n 复杂性过高并且可以改进 在指定的标准内是否可以进
  • PHP:对象上的递归 htmlspecialchars

    我想为来自不同来源的数据建立一个通用的清理程序 对于清理 我的意思是 在这个阶段 将 htmlspecialchars 应用于字符串 现在 来自这些源的数据可以是任何东西 从对象到数组再到字符串 都是嵌套的 而且很复杂 并且格式总是有点不同
  • 如何在 C++ 中创建多个向量的组合而无需硬编码循环?

    我有几个数据看起来像这样 Vector1 elements T C A Vector2 elements C G A Vector3 elements C G T up to VectorK elements Note also that
  • 交换数组中的奇数和偶数

    我在这个网站上看到了这段代码 它使用一种方法对数组进行排序 偶数在前面 奇数在数组后面 我想知道你是否可以做同样的事情 除了先出现奇数 然后出现偶数 我尝试过但没有成功 我是java编码新手 我想测试递归 public class Recu
  • 用于展平嵌套列表的递归生成器

    我是一名编程新手 在理解我的 Python 教科书 Magnus Lie Hetland 的 Beginning Python 中的示例时遇到了一些困难 该示例是一个递归生成器 旨在展平嵌套列表的元素 具有任意深度 def flatten
  • 使用递归对数字求和

    我刚刚研究了递归的概念 我想尝试一个简单的例子 在下面的代码中 我尝试获取数字 1 2 3 4 5 并使用递归将它们加在一起 我预计结果是 15 但我的代码返回 16 我究竟做错了什么 Code static void Main strin
  • 递归获取所有孩子

    我需要递归地从嵌套对象中获取所有子对象 我已经写了一个函数来做到这一点 有点 但我认为它可以改进 我怎样才能让它更短更干净 我已经包含了我用于测试的数据以及我编写的需要改进的函数 let data id 1 child id 2 child
  • 使用 apply 函数重写循环

    我有以下 3 个函数 我想使其更快 我认为应用函数是最好的方法 但我从未使用过应用函数 所以我不知道该怎么做 任何类型的提示 想法和代码片段将不胜感激 n T dt 是全局参数 par 是参数向量 函数 1 是创建 m 1 n 矩阵的函数
  • Java 中的递归回溯解决填字游戏

    我需要在给定初始网格和单词的情况下解决填字游戏 单词可以多次使用或根本不使用 初始网格如下所示 这是一个单词列表示例 pain nice pal id 任务是填充占位符 水平或垂直长度 gt 1 像那样 p pain pal id i c
  • Javascript 'this' 覆盖 Z 组合器和所有其他递归函数

    背景 我有一个由a实现的递归函数Z 组合器如图所示here https stackoverflow com questions 17645356 anonymous recursion any way to replace javascri
  • 为什么这个记忆器适用于递归函数?

    我不明白为什么下面的代码是这样的fib以线性而非指数时间运行 def memoize obj Memoization decorator from PythonDecoratorLibrary Ignores kwargs cache ob
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • 如何使用递归获取父级的所有子级,然后获取其子级

    问候 我的 JSP Web 应用程序中有父事务的比喻 我将事务 ID 存储在数据库中 要求是显示父级的所有子级 然后显示父级子级的后续子级 实际上 这个父母及其孩子的列表永远不会超过 4 或 5 层 但我需要考虑到它可以比这更多层 我尝试过
  • 带子图聚合的递归查询(任意深度)

    我问了一个问题earlier https stackoverflow com questions 28036055 recursive query with sub graph aggreagation关于沿着图表聚合数量 提供的两个答案效
  • 编程语言解析器的来源?

    我正在清理我的一个旧项目 该项目计算有关大型软件项目的许多简单指标 指标之一是文件 类 方法的长度 目前 我的代码 猜测 类 方法边界的位置基于非常粗略的算法 遍历文件 维护 当前深度 并在遇到未加引号的括号时调整它 当您返回到类或方法开始
  • 递归和大O

    我最近正在完成一项涉及递归和大 O 表示法的计算机科学作业 我相信我很好地理解了这一点 虽然当然不是完美的 但是有一个问题给我带来了最多的问题 奇怪的是 一看就知道是作业上最简单的一个 使用大哦符号提供最佳增长率来解决以下递归问题 T 1
  • 为什么Python有最大递归深度?

    Python有最大递归深度 但没有最大迭代深度 为什么递归受到限制 把递归当成迭代来对待 而不限制递归调用的次数不是更自然吗 我只想说这个问题的根源来自于尝试实现流 参见这个问题 https stackoverflow com questi
  • 使用reduce方法的斐波那契数列

    于是 我看到有人用reduce方法来计算斐波那契数列 这是他的想法 1 0 1 1 2 1 3 2 5 3 对应于 1 1 2 3 5 8 13 21 代码如下所示 def fib reduce n initial 1 0 dummy ra
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 在堆栈已满并给出分段错误之前,C/C++ 中的最大递归函数调用次数?

    我正在做一个问题 我使用递归函数来创建线段树 对于较大的值 它开始出现分段错误 所以我之前认为可能是因为数组索引值越界 但后来我认为这可能是因为程序堆栈太大 我编写这段代码是为了计算系统出现段错误之前允许的最大递归调用次数 include

随机推荐

  • for-each 内的方案延续

    我目前正在大学学习一门课程的计划 在查看一些练习时 我陷入了这个特定的练习中 教授尚未回复我之前的邮件 因此我有更多机会更快地收到答复 鉴于此代码 define list iter cc lst call cc lambda return
  • cin 的 isdigit 问题

    我有一个有符号整数变量 当我在 main 中执行此操作时 它也会给我整数值 错误 int main unsigned int a while cin gt gt a if isdigit a cout lt lt Error lt
  • ios NSError 类型

    自从我添加了这个async请求 我收到 xcode 错误Sending NSError const strong to parameter of type NSError autoreleasing changes retain relea
  • Rshinydashboard-根据用户输入显示/隐藏多个菜单项

    这个想法是有一个用户输入 访问代码 基于该输入可以访问不同的菜单项 所以基本上我们可以根据用户的要求提供自定义版本的应用程序 3 个菜单项的工作示例如下 library shiny library shinydashboard librar
  • 无法在 Java 应用程序中连接到 SQLServer 数据库

    我已在尝试开发的 JSF Web 应用程序中连接到我的数据库 使用 Windows 7 NetBeans 6 9 1 SQLServer 2008 Glassfish 3 3 我正在使用sqljdbc4 jar我从 XP 系统复制了驱动程序
  • 使用 Java 访问嵌套 JSON 对象的最佳方法

    我是使用 JSON 的新手 我想知道是否有更好的方法来完成我在下面的代码中所做的事情 您会注意到 要访问嵌套的 JSON 对象 我必须先创建子 JSON 对象 数组 然后才能访问 JSON 数组元素 leagues 有没有更快或更简单的方法
  • 使用 volatile long 作为原子

    如果我有这样的事情 volatile long something global 0 long some public func return something global 当使用多个线程访问时 期望此代码不会中断 竞争条件 是否合理
  • 为什么 pyautogui 点击实际上没有点击

    我尝试使用 Pyautogui 的单击功能 但实际单击没有发生 或者至少页面没有变化 尽管它将鼠标移动到正确的位置 该窗口处于焦点位置 我认为 因为该程序与其他页面配合得很好 我只能找到一个相关问题 单击程序时遇到问题 pyautogui
  • 当应用程序在 Xcode 中停止时自动关闭 iOS 模拟器

    每当 Xcode 中的应用程序停止时 是否可以让 iOS 模拟器关闭 退出 我无法在 Xcode 或模拟器中找到执行此操作的设置 如果存在的话 它将有助于加快开发进程 要在构建停止时终止模拟器 您需要编译一个可执行文件 包括以下内容 bin
  • 如何在Windows Phone中对在线内容进行数据虚拟化?

    我有一个从互联网获取内容的应用程序 这些信息太大了 无法容纳在内存中 LongListSelector does UI Virtualization出色地 遗迹Data Virtualization 我认为解决方案是先将数据保存在数据库中然
  • 使用 pcntl_fork() 提高 HTML 抓取效率

    在前两个问题的帮助下 我现在有了一个可以工作的 HTML 抓取工具 可以将产品信息输入数据库 我现在想做的是通过让我的刮刀工作来提高效率pcntl fork 如果我将 php5 cli 脚本分成 10 个单独的块 我会在很大程度上提高总运行
  • 如何为不同的配置设置不同的应用程序图标?

    在项目属性对话框中的 应用程序 选项卡上 用于选择配置的下拉列表被禁用 如何将图标设置为依赖于构建配置 这可能会带来一些启发 但我认为它仅适用于 VS2010 应用程序图标 如何选择基于编译器指令的不同图标 32338
  • 正则表达式替换 Javascript 中的算术运算符

    我有一个包含算术运算符的字符串数组 我想用新的算术运算符替换数组中的这些算术运算符 例如 var equation 5 0 9 34 6 0 2 1 3 1 2 0 var newEquation equation replace 然而 它
  • 如何为 Junit 单元测试设置 JVM 参数?

    我有一些 Junit 单元测试需要大量堆空间才能运行 即 1G 他们测试 Webstart 应用程序的内存密集型功能 该应用程序仅在足够的堆空间下运行 并且将在 Win 7 64 位计算机上内部运行 因此重新设计测试并不是一个实际的建议 我
  • 为什么当我调用 Canvas3D.repaint() 时 Java3D 画布会闪烁

    我在 Java3D 画布上使用 postRender 绘制了 2D 元素 并希望对这些元素进行动画处理 在循环中我调用 Canvas3D repaint while animationIsRunning I update positions
  • 如何获取 tab_id 将其设置为活动选项卡

    我正在尝试使用 tkinter 构建一个文本编辑器 我只是想将焦点设置在新打开的选项卡中 通过使用静态 tab id 我可以立即设置它 但如果我一次有超过 15 个选项卡 则很难找到 tab id 我想要 tab id 与 tab name
  • 如何获取数字的数字而不将其转换为字符串/字符数组?

    如何在 C 中获取数字的数字而不将其转换为字符串或字符数组 下面按重要性升序打印数字 即个位 然后是十位 等等 do int digit n 10 putchar 0 digit n 10 while n gt 0
  • “拖动”移动 uibutton,使其行为类似于 uiScrollView

    我需要在屏幕上上下滑动 uibutton 仅限 Y 它需要被限制在一个区域内 我希望能够点击它并拖动or轻拂它 就像 uiScrollView 一样 它与 uiScrollView 不同的原因是您必须从按钮开始 而不是从 uiScrollV
  • 批处理文件成功和错误记录

    有没有办法在批处理文件中记录批处理文件的错误和成功 我正在尝试将文件从我的计算机复制到 200 台机器 效果很好 但想知道哪个失败以及失败的原因 因为屏幕消失得很快 echo off if 1 goto usage echo mapping
  • Antlr左递归问题

    我的 Antlr 语法中存在左递归问题 虽然我认为我理解为什么会出现问题 但我无法想出解决方案 问题出在我的数据类型规则的最后一行 我已经包含了完整的语法供您查看 grammar Test options output AST ASTLab