xtext 中的终端/数据类型/解析器规则

2024-02-09

我正在使用 xtext 2.4。 我想做的是类似 SQL 的语法。 让我困惑的是我不确定哪些东西应该被视为终端/数据类型/解析器规则。到目前为止我的语法相关MyTerm is:

Model:
    (terms += MyTerm ';')*
;

MyTerm:
    constant=MyConstant | variable?='?'| collection_literal=CollectionLiteral 
;

MyConstant
    : string=STRING 
    | number=MyNumber
    | date=MYDATE 
    | uuid=UUID 
    | boolean=MYBOOLEAN
    | hex=BLOB
;

MyNumber:
    int=SIGNINT | float=SIGNFLOAT
;


SIGNINT returns ecore::EInt:
    '-'? INT
;


SIGNFLOAT returns ecore::EFloat:
    '-'? INT '.' INT;
;

CollectionLiteral:
    => MapLiteral | SetLiteral | ListLiteral
;

MapLiteral:
    '{' {MapLiteral} (entries+=MapEntry (',' entries+=MapEntry)* )? '}'
;

MapEntry:
    key=MyTerm ':' value=MyTerm
;

SetLiteral:
    '{' {SetLiteral} (values+=MyTerm (',' values+=MyTerm)* )+ '}'
;

ListLiteral:
    '[' {ListLiteral} ( values+=MyTerm (',' values+=MyTerm)* )? ']'
;

terminal MYDATE:
  '0'..'9' '0'..'9' '0'..'9' '0'..'9' '-'
  '0'..'9' '0'..'9' '-'
  '0'..'9' '0'..'9'
;

terminal HEX:
    'a'..'h'|'A'..'H'|'0'..'9'
;   

terminal UUID:
    HEX HEX HEX HEX HEX HEX HEX HEX '-'
    HEX HEX HEX HEX '-'
    HEX HEX HEX HEX '-'
    HEX HEX HEX HEX '-'
    HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX
;

terminal BLOB:
    '0' ('x'|'X') HEX+
;

terminal MYBOOLEAN returns ecore::EBoolean:
    'true' | 'false' | 'TRUE' | 'FALSE'
;

几个问题:

  • 如何定义带符号的整数?如果我定义另一个终端规则terminal SIGNINT: '-'? '0'..'9'+;,antlr 会抱怨 INT 无法访问。因此我将其定义为数据类型规则SIGNINT: '-'? INT;这是正确的方法吗?

  • 如何用符号定义浮点数?我所做的与定义带符号的整数完全相同,SIGNFLOAT: '-'? INT '.' INT;,不确定这是否也正确。

  • 如何定义日期规则?我想使用解析器规则在字段中存储年/月/日信息,但将其定义为MyDate: year=INT '-' month=INT '-' date=INT;antlr会抱怨Decision can match input such as "RULE_INT '-' RULE_INT '-' RULE_INT" using multiple alternatives: 2, 3 As a result, alternative(s) 3 were disabled for that input

  • 我还有一些其他规则,例如

下列

RelationCompare:
    name=ID compare=COMPARE term=MyTerm
;

but a=4将不是有效的RelationCompare因为a and 4将被视为HEXs。我发现这是因为如果我将关系更改为j=44然后就可以了。在这个post http://zarnekow.blogspot.com/2012/11/xtext-corner-6-data-types-terminals-why.html它说早期定义的最终规则将影响后来定义的最终规则。但是,如果我重新定义terminal ID在我的语法中,无论是放在...前面还是后面terminal HEX,antlr会抱怨The following token definitions can never be matched because prior tokens match the same input: RULE_HEX,RULE_MYBOOLEAN。这个问题发生在k=0x00b以及。k=0xaab是有效的,但是k=0x00b is not.

有什么建议吗?


如何定义带符号的整数?

  • 将其视为两个单独的令牌'-' and INT,并使用解析器规则而不是词法分析器规则。

如何定义带有符号的浮点数?

  • 将其视为两个单独的令牌'-' and FLOAT,并使用解析器规则而不是词法分析器规则。

如何定义日期规则?

  • 将其视为五个单独的标记,并使用解析器规则而不是词法分析器规则。

我不知道最后一个问题的答案,因为这是在 Xtext 中而不是在 ANTLR 中。

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

xtext 中的终端/数据类型/解析器规则 的相关文章

  • 编写没有语法文件的自定义 Xtext/ANTLR 词法分析器

    我正在为 CoffeeScript 编写一个 Eclipse Xtext 插件 我意识到我可能需要手动为其编写一个词法分析器 CoffeeScript 解析器还使用手写词法分析器 https github com jashkenas cof
  • 使用 Antlr 获取标识符和函数名称

    我正在尝试使用和理解 AntLR 这对我来说是新的 我的目的是读取用 C 编写的源代码文件并从中提取标识符 变量和函数名称 在我的 C 语法中 文件C g4 考虑 identifierList Identifier identifierLi
  • ANTLR如何在输入结束时检测垃圾数据

    当使用 ANTLR 编写的语法时 解析器可以正确识别输入流中的数据 但如果我在输入末尾有一些垃圾文本 不应该由语法解析 解析器不会抱怨 我想这种行为是可以的 我的意思是解析器完成了它的工作并解析了我所说的它应该解析的任何内容 但是有什么技巧
  • ANTLR:“规则范围内缺少属性访问”问题

    我正在尝试构建一个 ANTLR 语法来解析标记句子 例如 DT The NP cat VB ate DT a NP rat 并有语法 fragment TOKEN A Z a z fragment WS t WSX WS DTTOK DT
  • ANTLR4:词法分析器规则:任何字符串,只要不包含这两个并排字符?

    有没有办法在 ANTLR4 中表达这一点 任何字符串 只要它不立即包含星号 后面跟着一个正斜杠 这不起作用 因为 ANTRL 抛出此错误 multi character literals are not allowed in lexer s
  • ANTLR 4 树注入/重写运算符

    在 ANTLR 3 中您可以执行以下操作 andExpression andnotExpression gt andnotExpression AND a andnotExpression gt AndNode andExpression
  • 如何使用ANTLR生成的语法文件?

    我认为这是一个愚蠢的问题 但我刚刚开始使用 ANTLR 我将他们教程中的 SimpleCalc 语法放在一起 并以 C 作为目标语言生成它 我得到了 SimpleCalcParser c h 和 SimpleCalcLexer c h 作为
  • 如何使用Antlr实现函数调用,以便在定义之前就可以调用它?

    一旦构建了 AST 实现树遍历器以便可以按任意顺序定义和调用函数的最佳方法是什么 例如 这在 PHP 中是有效的 我猜想一定有第二遍 或者树转换 但我在这个主题上找不到任何有趣的东西 这个问题可能不是 Antlr 特有的问题 但如果你能给我
  • 将简单的 Antlr 语法转换为 Xtext

    我想将一个非常简单的Antlr语法转换为Xtext 所以没有句法谓词 https stackoverflow com questions 5728659 translate antlr grammar into xtext grammar
  • 删除这种左递归方式来定义 SELECT 语句

    我正在尝试解析以下内容SELECT陈述 select 1 union all select 1 union all with cte as select 1 select 1 from tbl limit 1 union all selec
  • 将 ANTLR 语法翻译为 XText 语法:如何删除句法谓词

    我对 Xtext 和 ANTLR 都很陌生 我需要将 ANTLR g 语法转换为 XTEXT xtext 语法 在 ANTLR 语法中 存在 Xtext 不支持的语法谓词 有没有办法删除 翻译这些谓词 Thanks EDIT 我尝试翻译的
  • 对话框中的 Xtext DSL 嵌入式编辑器

    我是 xtext 的新手 我已经使用 xtext 创建了 DSL 并且生成了工件 这生成了具有许多功能 如内容辅助和语法着色 的编辑器 现在的问题是我想将编辑器嵌入到对话框中 为了实现此目的 我使用嵌入式编辑器 我能够获取嵌入式编辑器并将其
  • 将 Xtext 与 StringTemplate 代码生成器链接

    在我当前的项目中 我试图链接用 xtext 编写的 DSL 规范和用 StringTemplate 编写的代码生成器 例如 我的 DSL 规范的语法如下 我通过 xText 提供的优秀编辑器工具输入此信息 structs TempStruc
  • ANTLR4 相当于什么!在词法分析器规则中?

    我正在努力将旧的 ANTLR 2 语法转换为 ANTLR 4 但我在字符串规则方面遇到了问题 STRING r n 这创建了一个STRING其文本包含字符串内容的标记 但是不含开始和结束引号 因为 引号文字后面的符号 ANTLR 4 扼流圈
  • 有没有使用 ANTLR 或类似语言实现的简单语言?

    我正在尝试构建一种简单的解释语言以用于学习目的 我读过无数关于 ANTLR 和 JavaCC 的理论和教程 但我不知道如何真正让它做一些有用的事情 我通过 把东西拆开然后重新组合起来 来学得最好 那么 是否有任何在 ANTLR 或类似工具的
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • XText 对非 DSL 资源的交叉引用

    请考虑这个最小的 Xtext 语法 Model As a stackeholder Stakeholder I want want Want Stakeholder client developer manager Want everyth
  • Xtext和ANTLR之间有什么关系?

    我听说Xtext最终使用ANTLR 但他们的语法规范文件的格式有些不同 那么两者之间是什么关系呢 Xtext 依赖于 Antlr 解析器生成器来解析输入文件 除此之外 该框架还提供了许多附加值 例如强类型 AST 链接抽象和静态分析以及 E
  • Antlr 解析器运算符优先级

    考虑以下语法 我对运算符优先级有疑问 例如 res 2 a b有一个类似的解析树res 2 a b 我知道问题出在哪里 但我没有想到没有相互左递归的 漂亮 解决方案 你能帮我一点忙吗 该语法与自定义访问者一起使用 grammar Math
  • 使用 ANTLR4 识别单行中的多行注释

    我想用 ANTLR4 解析 PostScript 代码 我完成了语法 但是一种特定的语言扩展 由其他人引入 很难被识别 一个简短的例子 1 This is a line comment 2 The next line just pushes

随机推荐

  • Firestore 模拟器 REST API 身份验证

    我正在寻找 Firestore 模拟器 REST API 处理未经身份验证的请求的方式的预期行为的一些确认 因为我认为我可能发现了一些可能的不一致之处 我一直在使用 Postman 的个人项目来使用 Firestore Emulator R
  • 实体框架 6.1 更新记录的子集

    我有一个仅封装的视图模型some数据库模型属性 视图模型包含的这些属性是我想要更新的唯一属性 我希望其他财产能够保持其价值 在我的研究过程中我发现this https stackoverflow com a 15339512 2015959
  • mediaelement.js - 在第一个视频末尾播放另一个视频

    由克罗克 Video forEveryone 推荐 我希望能够在第一个视频结束后自动播放第二个视频 然后在第二个视频结束后显示静态图像 经过一段设定的时间后 循环回到第一个视频 Thanks function audio video med
  • 启动带有视频的 Youtube 应用程序

    我有一个带有 UIButton 的应用程序 我希望 当我单击 iPhone 启动 Youtube 应用程序的按钮时 我的视频可以直接开始播放 我尝试了以下代码 UIApplication sharedApplication openURL
  • 如何查找表中长列的长度

    我在名为 Files 的表中有一个名为 FileSize 的 LONG 列 为了实现这一目标 我做了以下工作 我编写了这个 PL SQL 脚本来查找大小 declare long var LONG 0 begin dbms output p
  • 有状态 Rsocket 应用程序

    在我的项目中 我想让多个客户端连接到一个服务 我正在使用 java Rsocket 实现 该服务应该为每个客户端维护一个状态 现在 我可以通过某种标识符来管理客户端 这个选项我已经实现了 但我不想使用字符串手动管理会话 所以另一个想法是通过
  • 在 C# 中使用委托

    在 C 语言和 NET 框架中 你能帮助我理解委托吗 我试图检查一些代码 发现收到的结果出乎我的意料 这里是 class Program public static int I 0 static Func
  • 为什么元组联合期望“never”作为“.includes()”参数?

    type Word foo bar baz const schema foo foo as const bar bar as const baX bar baz as const const testFn schemaKey keyof t
  • Rails:无效的单表继承类型错误

    因此 我正在努力使用现有数据库迁移这个 php 站点 但我无法将其更改为 Rails 这里有张桌子 Quotes有一列名为type 每当我尝试创建此模型并设置类型时 它都会告诉我以下错误 ActiveRecord SubclassNotFo
  • C++ 中重载赋值运算符

    据我了解 重载operator 时 返回值应该是非常量引用 A A operator const A check for self assignment do assignment return this 在以下情况下允许调用非常量成员函数
  • 使用字符串插值将字符串格式化为列

    我需要打印双精度数 以便为值的字符串表示分配一定数量的符号 例如 8 接下来的单词应该从每个字符串中的字符串开头的相同索引处开始 我现在有 value 0 test value 0 3333333333333 test value 0 5
  • 如果所有给定单词都在字符串中,则匹配正则表达式

    假设我有一个这样的查询 一二三 如果我用 替换空格 管道字符 如果字符串包含一个或多个这些单词 我可以匹配该字符串 这就像逻辑 或 是否有类似的东西可以进行逻辑与 只要字符串中存在所有单词 无论单词顺序如何 它都应该匹配 不幸的是我离开了我
  • 当两个 .c 文件具有相同符号但不同类型的全局变量时,引用如何工作?

    C 假设我有以下 C 模块 MODULE 1 include
  • 自动/机器人消息发布到 Microsoft-Teams 聊天室

    如何自动将消息发布到 Microsoft Teams 中的聊天室 这是针对单向消息传递的 即发布消息 而不是阅读消息 这里的大局是我们正在评估不同的群聊解决方案 其中一项要求是将错误消息从各种服务和程序发布到聊天室 一个明智的方法似乎是建立
  • Django 错误电子邮件太长。我该如何截断它?

    Django 1 9 中的错误电子邮件似乎比以前长得多 有一个完整的 设置 部分 我认为这是多余的 而且可能太暴露了 编辑 Django 发送的错误电子邮件的最佳方法是什么 编辑 我不仅仅是想隐藏敏感信息 Django 1 9 中的电子邮件
  • Repeater 控件中的水平方向

    我有一个 Repeater 控件 用于显示上传的图像 如何水平显示复读机中的图像 我怎样才能将标题添加到图片的底部 假设你有这样的代码
  • 读取 opencv_face.LBPHFaceRecognizer.getHistograms() 中的值

    我正在尝试使用 android 中的 opencv 库 我以前从未研究过它 所以这可能是一个非常基本的问题 我有一个opencv face LBPHFaceRecognizer我的对象识别器活动 我的要求是读取先前存储的面部的直方图值 op
  • 分叉 - 相同的内存地址?

    这是关于 Linux 中的 C 语言 I have fork in main 我在其中创建了 2 个子进程 然后 在两个子进程中运行该函数abc 其中有一个局部变量x 我在里面写了一些值 然后我打印这个变量的地址printf p x 两个进
  • Get-ChildItem - 过滤器数组

    情况 Get ChildItem Path Filter dll为我工作 这有效 Path env windir system32 GuyArray dll exe Get ChildItem Path Include GuyArray 但
  • xtext 中的终端/数据类型/解析器规则

    我正在使用 xtext 2 4 我想做的是类似 SQL 的语法 让我困惑的是我不确定哪些东西应该被视为终端 数据类型 解析器规则 到目前为止我的语法相关MyTerm is Model terms MyTerm MyTerm constant