问题标签 [parsekit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - ParseKit 简单示例不起作用,并且 parserFromGrammer 在控制台中显示了许多带有 PEGRecognitionExceptions 的异常
我刚刚遇到 ParseKit,并使用http://parsekit.com/iphone.html中的说明将其合并到我的 IOS 项目中。我从 Google Code 得到它,签出的版本是 1543。一切编译和构建都很好。
然后我尝试使用其中一篇文章中的(最终工作)简单示例 - Can't get simple ParseKit example working
当执行到达该行时
我在控制台中看到很多错误消息。didMatchFoo 和 didMatchBar 不会触发。
以下是来自控制台的消息:
不调用回调,也不返回任何错误。
任何指示或帮助将不胜感激!
PS - 我在 ParseKit 中取消了一些 NSLOG 语句的注释,以查看上述异常是什么:
对于一个语法
我有
parsing - 这个 ParseKit 语法有什么问题?
这是我要解析的文档:
我已经将语法定义如下:
我遇到问题的部分是短语字典 - 第二个 ThaKaThaRiKiTaThaKa 被解析为短语,akshara 和 aksharaGroup,正如预期的那样,但是我得到了我希望它匹配它的异常短语字典
使用 ParseKit 的无限前瞻,它不应该继续并匹配短语字典语法吗?
我错过了什么?
谢谢, 斯里达尔
parsekit - 生成解析器:didMatchInterior:回调
我正在使用 ParserGenApp 生成一个静态解析器。生成的代码包含“parser:didMatch[Rule]:”形式的汇编回调。但是,在 DempApp 中的 JavaScriptSyntaxParser 中,回调的形式为“parser:didMatchInterior:”等。我可以让 ParserGenApp 生成这样的调用吗?还是您手动添加的?
谢谢/米凯尔
parsekit - Parsekit,使用 ParserGenApp 并包含创建的类失败。调用 PKParserFactory 并提供相同的语法工作
我有一个语法(包括在下面,但其他示例也一样),我通过 ParserGenApp 运行并在我的应用程序中使用生成的类。它失败并出现以下错误:
但是,在同一个应用程序中,调用
工作得很好。
语法是:
ios - 为 iOS 7 创建文本编辑器
问题
我需要了解 TextKit 的工作原理以及如何使用它来构建文本编辑器。我需要弄清楚如何仅绘制最终用户与之交互的可见文本,或者确定如何在 processEditing 方法中将属性仅应用于可见文本而不将属性应用于整个更改的文本范围。
背景
iOS 7 推出了 TextKit。我有一个完全实现 TextKit 的标记器和代码(请参阅 Apple 的 TextKitDemo 项目——下面提供了一个链接)......并且它可以工作。但是,它真的很慢。当文本被 NSTextStorage 解析时,它要求您在 processEditing 方法中在同一线程上对已编辑文本的整个范围进行着色。将工作卸载到线程并没有帮助。简直太慢了。我已经到了只能重新归因修改后的范围的地步,但如果范围太大,过程会很慢。在某些情况下,整个文档在进行更改后可能会失效。
以下是我的一些想法。请让我知道这些中的任何一个是否会起作用,或者可能会推动我朝着正确的方向前进。
1) 多个 NSTextContainers
阅读文档,我似乎可以在 NSLayoutManager 中添加多个 NSTextContainers。我假设通过这样做,我不仅应该能够定义可以在 NSTextContainer 中绘制的行数,而且我还应该能够知道最终用户可以看到哪个 NSTextContainer。我知道如果我走这条路,我将需要投入大量时间来看看它是否可行。初步测试表明您只需要一个 NSTextContainer。所以我必须继承 NSLayout 或创建一个包装器,其中布局管理器确定哪些文本进入哪个文本容器。呸。另外,我不知道 TextKit 是如何让我知道是时候绘制一个特定的 NSTextContainer 了……也许这不是它的工作原理!
2) 使用 NSLayoutManager 使范围无效
使用 invalidateLayoutForCharacterRange:actualCharacterRange: 使 layoutManager 无效。但这实际上是做什么的,它将如何减轻文本归因阶段的负担?它什么时候让我知道需要突出显示特定文本?另外,我看到 NSLayoutManager 会懒惰地绘制字形......如何?什么时候?这对我有什么帮助?我如何利用这个调用,以便我可以在它实际布置文本之前归因于支持字符串?
3) 覆盖 NSLayoutManager drawGlyphsForGlyphRange:atPoint: 方法。
我真的不想这样做。话虽如此,在 Mac OS X 中,NSAttributedStrings 具有临时属性的概念,其中样式信息仅用于表示。这大大加快了突出显示的过程!问题是,它在 iOS 7 TextKit 框架中不存在(或者它在那里,我只是不知道)。我相信,通过覆盖此方法,它将为我提供与使用临时属性相同的速度......因为我可以在此方法中回答所有布局、颜色和格式问题,而无需触及 NSTextStorage 属性细绳。唯一的问题是,我不知道这个方法相对于 NSLayoutManager 类中提供的其他方法是如何工作的。它是否保持宽度和高度的状态?当 NSTextContainer 太小时,它会修改它的大小吗?此外,它仅绘制已添加到文本缓冲区中的字符的字形。它不会重新绘制整个屏幕。只有一小部分......这很好。我对如何使用它有一些想法……但我真的不想布置字形。那是太多的工作,我还没有找到一个很好的例子来做到这一点。
我将非常感谢您提供的任何帮助。
作为感谢,我列出了我在过去几年中使用过的所有框架和参考资料,这些框架和参考资料帮助我达到了现在的水平,希望它们对你有所帮助。
语法高亮框架:
- http://colorer.sourceforge.net/
- https://github.com/MikeJ1971/Glint(不支持字符串、注释等)
- https://projects.gnome.org/gtksourceview/features.html(为令牌生成提供了一个不错的库。与 GTK 一起工作,但可能会为不同的布局管理器重写)
- http://parsekit.com/(很好的解析器。但是,当需要修复范围时,您必须包装 API 以创建状态机)
- http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Languages/LanguageKit/
- https://github.com/CodaFi/IDEKit(令人惊叹的工作。这段代码中有很多好主意。我的问题是我完全不知道它是如何修复范围的,或者即使它确实如此)
- http://www.crimsoneditor.com/(一个旧的 Windows 代码编辑器。它有一个非常好的标记器——虽然有点难以阅读。它不使用正则表达式。话虽如此,我的标记逻辑是关闭的这段代码,它比上面列出的任何框架都快得多)
资源:
- http://cocoafactory.com/blog/2012/10/29/how-to-use-custom-nsattributedstring-attributes/
- https://github.com/objcio/issue-5-textkit
- http://alexgorbatchev.com/SyntaxHighlighter/
- http://docs.xamarin.com/samples/TextKitDemo/(苹果的演示)
- http://cocoadev.com/ImplementSyntaxHighlighting(一定要阅读所有的子文章。很棒的东西)
这些框架中的大多数都是相同的。它们要么不考虑范围的上下文切换(或者您必须编写包装器以提供上下文),要么它们不会在用户修改文本(例如字符串、多行注释等)时修复上下文范围。最后一个要求非常重要。因为如果分词器无法确定哪些范围受到更改的影响,您最终将不得不再次解析和属性整个字符串。唯一的例外是 Crimson 编辑器。这个分词器的问题是它在分词时不保存状态。在绘图时,算法使用标记来确定绘图状态。它从文档的顶部开始,直到到达可见的文本范围。不用说,
另一个问题是这些框架没有遵循 Apple 所做的相同 MVC 模式——这是意料之中的。具有完整工作编辑器的框架都使用由它们构建的 API(即 GTK、Windows 等)提供的钩子,这些钩子为它们提供关于何时何地绘制到屏幕哪个部分的信息。就我而言,TextKit 似乎要求您在 processEditing 中归因于整个更改范围。
也许我的观察是错误的。(我希望他们是!!)也许,例如 ParseKit,它将为我需要它做的工作而我根本不明白如何使用它。如果是这样,请告诉我!再次感谢!
objective-c - 算术解析器
我正在 ParseKit 测试的TDArithmeticParser.m之上构建一个解析器。我用测试扩展了TDArithmeticParserTest.mfailing
:
问题是我不明白为什么语法不适用于这个测试。算术解析器对应的 BNF 语法为:
我将非常感谢任何有助于我识别问题的想法。
java - 从 Antlr4-Java 切换到 ParseKit-Objective-C:ParseKit 中的通道?
问题:
不知道如何翻译 Antlr4 ".g4" 语法文件的内容以匹配ParseKit的语法。
具体来说:
如何-> Channel(HIDDEN);
从 Antlr4 语法翻译成 ParseKit 语法。
上下文:
我正在为 iOS 的 Objective-C/Xcode 创建一个 .Framework。我需要生成一个模仿 Java 中 Antlr4 生成解析器的基本功能的解析器。设计解析器功能的方法不是问题。我有兴趣了解有关ParseKit 语法语法的更多信息。
语法代码:
Antlr3:
WHITESPACE : [ \t\r\n]+ {$channel=HIDDEN;}
Antlr4:
WHITESPACE : [ \t\r\n]+ -> channel(HIDDEN);
ParseKit:如何忽略???
whitespace = /[\s\t\r\n]+/ __________________;
问题:
- ParseKit是否支持频道?
- ParseKit用来发送到隐藏频道
的语法是什么?
-或者,在 ParseKit 中是否有任何与 Channels 类似的性质?
objective-c - 如何使用 ParseKit 的 ParserGenApp 语法指定字符范围 [a-zA-Z]
问题:
无法使用ParseKit 的语法定义字符范围。
(从 A 到 Z 的字母,有或没有大写)。
语境:
我正在使用ParseKit 的ParserGenApp 生成解析器。
解析器用于 .Framework 并用作自定义语言解析器。Parser 将模仿使用Antlr4 for Java
生成的工作 Parser 。
例子:
Antlr4: CHAR : [a-zA-Z];
正则表达式: "[a-zA-Z]"
它将检测从“a”到“z”的任何字母,包括大写
替代正则表达式: "[c-xB-Y]"
问题:
如何使用 ParserGenApp 以语法方式定义字符范围?
ParseKit
中是否有语法指令,例如字符/字母的“单词”或“数字”?
是否有另一种声明范围的方法?
objective-c - ParseKit 动作中的自定义对象
我对向 ParseKit 语法添加动作的能力非常感兴趣。令人惊讶的是,关于这些操作中可用的内容的文档很少。假设我有两个规则,例如:
这显然不是一个完整的语法,但将作为一个例子。解析时,我想“返回”CreateTableStmt
具有某些属性的对象。如果我正确理解该工具,我会在规则中添加一个操作,然后将其推送到组件上,该组件将携带它以供下一个规则处理或使用。
例如,它看起来像:
然后,当所有内容都被解析时,我可以将根对象从堆栈中取出,它是语法的完全实例化的自定义表示。如果我没记错的话,有点像构建 AST。然后,我可以使用该表示进行操作,而不是使用传入的字符串。
我的问题是如何查看它是否匹配('TEMP' | 'TEMPORARY')
,以便设置值。这些令牌在堆栈上吗?有没有比弹回“CREATE”并查看我们是否通过它更好的方法。我是否应该在每场比赛中弹回堆栈底部?
另外,如果我的规则是
假设在匹配规则之前不会调用操作是否正确?因此,在这种情况下,将操作调用到堆栈时可能如下所示:
这些是正确的评估吗?是否有其他有关操作的文件?我知道它很大程度上基于 Antlr,但它的细微差别确实会给你带来麻烦。