- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个 bbcode -> html 转换器,它响应文本区域中的更改事件。目前,这是使用一系列正则表达式来完成的,并且存在一些病态案例。我一直想在这个语法上削尖铅笔,但不想涉足剃牛毛。但是......最近我开始意识到pegjs ,这似乎是 PEG 解析器生成的一个非常完整的实现。我已经指定了大部分语法,但现在我想知道这是否适合使用成熟的解析器。
我的具体问题是:
由于我的应用程序依赖于将我能翻译的内容翻译成 HTML 并将其余部分保留为原始文本,因此使用可能因语法错误而失败的解析器实现 bbcode 是否有意义?例如:[url=/foo/bar]click me![/url]
一旦输入结束标记上的结束括号,肯定会成功。但同时用户会看到什么?使用正则表达式,我可以忽略不匹配的内容并将其视为普通文本以供预览。对于正式语法,我不知道这是否可行,因为我依赖于从解析树创建 HTML,而解析失败的是……什么?
我不清楚应该在哪里进行转换。在一个正式的基于 lex/yacc 的解析器中,我会有头文件和表示节点类型的符号。在 pegjs 中,我得到了带有节点文本的嵌套数组。我可以将翻译后的代码作为 pegjs 生成的解析器的一个 Action 发出,但将解析器和发射器结合起来似乎有点代码味道。但是,如果我调用 PEG.parse.parse()
,我会得到如下结果:
[
[
"[",
"img",
"",
[
"/",
"f",
"o",
"o",
"/",
"b",
"a",
"r"
],
"",
"]"
],
[
"[/",
"img",
"]"
]
]
给定如下语法:
document
= (open_tag / close_tag / new_line / text)*
open_tag
= ("[" tag_name "="? tag_data? tag_attributes? "]")
close_tag
= ("[/" tag_name "]")
text
= non_tag+
non_tag
= [\n\[\]]
new_line
= ("\r\n" / "\n")
当然,我是在缩写语法,但你明白了。因此,如果您注意到,数组数组中没有上下文信息可以告诉我我拥有的节点类型,我不得不再次进行字符串比较,即使解析器已经做了这个。我希望可以在解析期间定义回调并使用操作来运行它们,但是 Web 上很少有关于如何做到这一点的信息。
我是不是找错了树?我是否应该退回到正则表达式扫描而忘记解析?
谢谢
最佳答案
第一个问题(不完整文本的语法):
可以添加
incomplete_tag = ("[" tag_name "="? tag_data? tag_attributes?)
// the closing bracket is omitted ---^
open_tag
并更改 document
以在末尾包含不完整的标签。诀窍是您为解析器提供所有需要的产品以始终 解析,但有效的产品排在第一位。然后您可以在实时预览期间忽略 incomplete_tag
。
第二个问题(如何包含 Action ):
你在表达式后写上所谓的 Action 。 Action 是用大括号括起来的 Javascript 代码,允许在 pegjs 表达式 i. e.还在制作中!
在实践中,像 { return result.join("") }
这样的操作几乎总是必要的,因为 pegjs 会拆分成单个字符。也可以返回复杂的嵌套数组。因此,我通常在语法头部的 pegjs 初始化器中编写辅助函数,以保持 Action 小。如果您仔细选择函数名称,则该操作是自记录的。
有关示例,请参阅 PEG for Python style indentation .免责声明:这是我的回答。
关于javascript - 使用 PEG 解析器进行 BBCode 解析 : pegjs or . .. 什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11268376/
使用语法 start = b / a a = "4" "2" b = "4" 与 peg.js识别 4 但不识别 42 在这种情况下错误 “第 1 行,第 2 列:预期的输入结束,但找
我试图了解如何使用 PEG.js 在文本中进行简单的搜索/替换。当然,这不是解析器的预期用途,但无论如何我对这些语言背后的逻辑感到好奇,以产生一些搜索/替换。 我遇到的问题是很难积极定义某些定义的互补
扩展我之前的帖子,我还在写汉诺塔。在解释了如何在钉子上画环的绝妙解决方案之后,我仍然有一个问题,我已经摆弄了很长一段时间了。 这是我的 PegClass: namespace Towers_Of_Ha
我最近遇到了 PEG 解析器和 Guido van Rossum 的 article on PEG parsers以及如何构建它们。那篇文章讨论了“PEG”解析器,但在内部它看起来就像一个递归下降解析
我的同事 PaulS 问了我以下问题: 我正在为现有语言(SystemVerilog - IEEE 标准)编写一个解析器,并且该规范中有一条结构与此类似的规则: cover_point =
我写了一个 PEG 解析器生成器只是为了好玩(有时间我会在 NPM 上发布它),并认为在它上面添加一个随机短语生成器会很容易。这个想法是在给定语法的情况下自动获得正确的短语。所以我设置了以下规则来从每
我很喜欢使用 YARD: http://www.ootl.org/yard/ http://code.google.com/p/yardparser/ http://www.codeproject.c
我正在使用 rust-peg 实现类似 OCaml 的语言我的解析器有一个错误。 我定义了 if 语句语法,但它不起作用。 我猜测试用例输入被解析为 Apply(Apply(Apply(Apply(f
我想使用 Peg.js 来解析和验证我一直在使用正则表达式所做的事情,但我正在努力解决语法问题。 我的 Peg.js 程序是: start = (var / other) cr d:var {retu
我正在尝试使用pegjs创建一个解析器。我需要解析类似的内容: blah blah START Lorem ipsum dolor sit amet, consectetur adipiscing e
我目前正在编写PEG.js语法,并且希望它输出自定义错误。例如,我目前具有用于创建函数的这种结构。 //Function Declaration FUNCTION_DECLARATION = FUNC
我当前遇到的问题是我的代码无法解决钉子纸牌的不同变体。我的测试程序测试了 4 个简单的可解板。 (1步解法)上一步、下一步、左一步、右一步。我的代码毫无问题地解决了这些问题,并测试了无法解决的板。我遇
使用 https://github.com/JetBrains/Grammar-Kit如何不用左递归重写文法? grammar ::= exprs exprs::= (sum_expr (';')?)
我正在尝试解析逗号分隔的列表。为了简单起见,我只使用数字。这些表达式是有效的: (1,4,3) () (4) 我可以想到两种方法来做到这一点,我想知道为什么失败的例子不起作用。我相信它是正确的 BNF
我将如何在 Treetop 中做这样的事情? /.+?;/ 似乎唯一的方法是这样做: [^;]+ ';' 哪个有点丑......还有其他方式吗? .+? 似乎不起作用.. 最佳答案 默认情况下 PEG
我在定义允许两个标签(包括那些标签)之间的任何文本的表达式时遇到问题。 例子: #ifdef asdasdasdasdasdsasd asdasdasdasdasdasdasd asdasdasda
我有以下 peg.js 脚本: start = name* name = '** name ' var ws 'var:' vr:var ws 'len:' n:num? ws 'label:' lb
我正在尝试创建一个钉跳拼图,并且正在执行格式说明符,我意识到算法尚未完成,但有人可以解释为什么我的条件被忽略吗?即使列不止一列,它也会运行格式规范。例如,在钉跳益智游戏中,第一行之后的每一行的每个“+
我在 PEG.js 和匹配单词方面遇到问题。 它看起来像这样:Words = "stack"/"overflow"/"stackoverflow" - 当我尝试匹配“stackoverflow”时,它
编辑:您可以在此处关注进度:https://github.com/simple-updates/template 我正在使用 peg.js并尝试编写一些可以解释模板的东西,例如: hello {{ "
我是一名优秀的程序员,十分优秀!