ANTLR Lua长字符串语法规则
2017-5-23 9:58:8
收藏:0
阅读:177
评论:1
我正在尝试创建Lua的ANTLR解析器。因此,我采用了由Nicolai Mainero(可在ANTLR网站上获取,Lua 5.1语法)生成的语法并开始工作。
语法不错。有一件事情不起作用:长字符串。
Lua规范规则:文字
字符串还可以使用由长括号括起来的长格式定义。 我们将等级为n的开口长括号定义为开口方括号 其后是n个等号,其后是另一个开口方括号。所以,一个 级别0的开口长括号写为[[,一个开口长括号 级别1写为[=,依此类推。关闭长括号也类似地定义;例如,关闭 级别4的长括号写为] ==== ]。长字符串以开口长括号开头的任何级别开始 并在同一级别的第一个关闭长括号处结束。在这种文字中 括号形式可以运行多行,不解释任何转义 序列,并忽略任何其他级别的长括号。他们可以包含 任何东西,除了适当级别的关闭括号。
我的问题与此相近,但工具不同。
LONGSTRING的一些小示例没有'='符号:
local a = [==[ Some interesting string [=[ sub string in string ]=] [hello indexes] [[And some line strings]] ]==] - 正确的字符串。
local f = [==[ Not interesting string ]=] - 不正确的字符串
这是我的规则,没有'='符号的LONGSTRING:
LONGSTRING:'[['(〜(']')|']'(〜(']'))* ']]';
有人能帮我吗?谢谢。
原文链接 https://stackoverflow.com/questions/4065327
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我曾按照规范编写了一个Lua语法,并像这样解决了它:
语法Lua; // ...选项... // ...记号... @lexer :: members { public boolean noCloseAhead(int numEqSigns){ if(input.LA(1)!= '] ')返回true; for(int i = 2; i < numEqSigns + 2; i++) { if(input.LA(i) != '=') return true; } return input.LA(numEqSigns+2) != ']'; } public void matchClose(int numEqSigns) throws MismatchedTokenException { StringBuilder eqSigns = new StringBuilder(); for(int i = 0; i < numEqSigns; i++) { eqSigns.append('='); } match("]"+eqSigns+"]"); } } // ...解析器规则... 字符串 : '"' (~('“' | '\\') | EscapeSequence)* '“' | ' ' '(~(' ' | '\\') | EscapeSequence)* ' ' ' | LongBracket ; 评论 : (BlockComment | LineComment){skip();} ; 片段 BlockComment : '-' - LongBracket ; 片段 LineComment : '-' - ('\r' | '\n') *('\r'?' \n'|EOF) ; 片段 LongBracket @init{int openEq = 0;} : '['('=' {openEq ++;}) *' ['({noCloseAhead(openEq)}?= >。)* {matchClose(openEq);} ; // ...更多的词汇规则...
要谨慎对待在ANTLR Wiki上找到的内容!正如其名称所示:它是一个维基百科,可以轻松地发布内容。您提到的Lua语法是一个很好的开始,但其中有相当多的错误(二进制或十六进制文字也是不正确的,至少在我查看它的时候...)。