问题标签 [tatsu]
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.
tatsu - 如何在 Tatsu 语法中包含文字“#”?
我无法让 Tatsu 解析包含文字“#”的语法。
这是一个最小的例子:
解析会引发FailedParse异常。跟踪似乎表明解析器与 '#' 文字不匹配:
如果我将语法更改为使用“#”以外的符号,它就可以正常工作。例如这有效:
不幸的是,我无法更改输入数据的格式。
c-preprocessor - 如何使用 Tatsu 构建预处理器解决方案?
我正在编写一个将 Tiny C 代码转换为 Python 代码的编译器,但我需要构建一个预处理器解决方案来替换#define
和管理编译器 C 指令(#ifdef、#else、#define ...)
我选择在 Python 中使用 pcpp 模块,但没有成功……在完整的 Tatsu 解决方案中是否有可能提供解决方案?
tatsu - 有没有办法在 tatsu 中进行上下文相关的解析
上下文敏感的 '%' ..... eol 评论
我从这里描述的 PDF 语法开始
https://github.com/caradoc-org/caradoc/blob/master/doc/grammar/grammar.pdf
这似乎缺乏 eol 评论的定义。
PDF 具有以 '%' 字符开头的行尾注释,但 string_literal (和另一个规则流)除外。
其中 string_content 可以包含“%”字符和 eol,但不能包含“()”等。PDF 语言也有一些特殊情况,否则看起来像注释,例如
或者
有没有办法处理 tatsu 语法中的上下文敏感性?
tatsu - Tatsu:规则排序
我正在与 Tatsu 一起为半导体行业使用的语言实现解析器。该语言要求在使用前定义变量。例如:
在这种情况下,SignalGroup 模块必须位于 Pattern 模块之前。在 TatSu 中编写语法时,我如何强制/实施这种“排序”?
grammar - 如何优化这个语法规则?
我正在使用 TatSu python 库实现语法。我的语法工作正常,但有一条规则会消耗相当多的时间。在大约 3000 行的块上(更大语法的一部分),如果我采用这条完整规则,解析整个块大约需要 42 秒。如果我将此规则减少到几个标记,则运行时间会从 42 秒下降到 33 秒(改进约 20%)。
该规则如下所示,它应该匹配一系列由“/”分隔的事件。
如果我将事件更改为以下内容,我会得到更快的解析。
那么是否有可能以某种方式改进上述规则以获得更快的处理?感谢您的任何想法。
tatsu - TatSu:如何优化以下语法逻辑以获得更快的解析时间?
我在 TatSu 中有以下语法。为了减少解析时间,我实现了剪切操作(即,一旦看到特定的标记,就提交到特定的规则选项)。
但是,我仍然看到运行时间很长。在大约 830K 行的文件上,大约需要 25 分钟(没有剪切表达式,它接近 40 分钟)。我认为进一步改进是可能的,但我不确定如何以更好的方式重写以下逻辑。
我认为花费大部分时间(通过观察 TatSu 语法匹配跟踪)的主要问题是vec_data_string / vec_data_strings。关于如何进一步改进这一点的任何建议?
我的测试文件有很多这样的序列:
python-3.x - TatSu:转储到 YAML 时出现 yaml.representer.RepresenterError
在成功解析后,我有一个由 TatSu 生成的对象模型。模型使用 JSON 格式转储到标准输出 OK。但是当我尝试将其转储到 YAML 时,我得到了一个 RepresenterError 异常。我不知道如何解决这个问题。对象模型由 TatSu 内部生成。任何人都可以阐明如何潜在地解决此错误吗?
将 python 3.7.0 与 TatSu v4.4.0 与 pyyaml 5.1.2 一起使用。
我的代码:
输出:
python - 在语义中引发异常后,是否可以继续使用其他规则进行解析?
在语义操作中引发异常后,是否可以回退到其他规则?就像下面的(人为的)场景:
并且当引发异常时,解析将继续使用“关键字”规则。我知道@@keyword 功能,但我想在运行时声明关键字(我的解析器是用于具有用户定义运算符的编程语言)。
python - Tatsu:如何在语义动作中验证/处理类似算术的表达式
我有一个 TatSu 语法,我正在解析算术表达式,例如SignalGroup {ABUS='A3 + A2 + A1 + A0';}.
相关语法:
AST 输出:
我想对此规则进行一些语义验证。也就是说,检查信号 A3-A0 是否已在其他(信号)块中声明。如果未声明,则引发错误。在解析另一个(信号)块时,我保留了所有信号的命名(符号)表以供查找。我想知道在语义动作代码中“走”这样一个 AST 的最佳步行是什么,因为如果我的表达式包含 200 个信号(即 A0 + A1 + .. A199),它可能非常深。现在,我只有一个像这样的存根函数:
我检查了 TatSu 文档,其中有一个部分,Walking Models
但似乎只有在构建完整模型 AST之后。也许我错了。在构建整个(顶级)模型时,有没有办法在语义验证规则中有效地遍历 signal_groups_block 的 AST?
参考:https ://tatsu.readthedocs.io/en/stable/models.html#walking-models
peg - 解析正确时如何处理 TatSu 中的语义失败?
我正在尝试为包含类 C 表达式的语言创建一个 TatSu 解析器。我对表达式有以下语法规则:
我在atom
规则上遇到了麻烦。解析以下内容时(作为andexpression
之间的部分):=
;
我得到了这个例外:
helper_call
当var_or_param
规则应该匹配得很好时,它试图使其符合规则却失败了。事实证明,原因是FailedSemantics
语义操作引发的错误var_or_param
。一旦我解决了这个问题,解析就会按预期工作。
这就提出了一个问题:如果FailedSemantics
影响解析逻辑,当出现语义错误时,什么是正确的方法来提醒用户,但解析逻辑在其他方面是正确的,不应该尝试不同的选择或规则?例如,声明前的类型不匹配或变量使用?(理想情况下,仍然会显示发生错误的行号。)