【问题标题】:How to process the stuctured language file in python如何在python中处理结构化语言文件
【发布时间】:2015-02-26 15:35:44
【问题描述】:

我有一个像这样的大型结构化语言文件:

TASK SchM_Task {
    TYPE = AUTO;
    SCHEDULE = NON;
    PRIORITY = 160;
    ACTIVATION = 1;
    TIMING_PROTECTION = FALSE;
    AUTOSTART = FALSE;
    EVENT = SchM_Event;
    RESOURCE = SystemS_Resource;
    StackSize = 1024;
    NotUsingSchedule = FALSE;
}: "BSW task for calling of bsw runnables";
ALARM SchM_Alarm {
    COUNTER = SystemTimer;
    ACTION = SETEVENT
    {
       TASK = SchM_Task;
       EVENT = SchM_Event;
    };
    AUTOSTART = FALSE
    {
       StaticAlarm = FALSE;
    };
};
RESOURCE SystemS_Resource {
    RESOURCEPROPERTY = INTERNAL;
}: "Via this resource the cooperativ behavior can be set";
EVENT SchM_Event {
   MASK = AUTO;
};
ISR CanIsr_1 {
   CATEGORY = 2;
   TIMING_PROTECTION = FALSE;
   EnableNesting = TRUE;
   InterruptLevel = 30;
   InterruptSource = CAN1IRQ;
   StackSize = 1024;
   UseSpecialFunctionName = FALSE;
}: "CAN Send/Receive (main CAN)";

我对 python 和脚本非常陌生。如何使用 python 将此文本文件解析为 AST。在网上搜索时,我发现 python 中的 grako 可能是一个选项。您能否解释一下 grako 如何使用示例代码工作。先谢谢了。

【问题讨论】:

  • 我如何设法使用 grako 解析文件。所以现在我有 AST 和 JSON 数据结构。但现在我想编辑 AST 并重新生成文件。 grako 会做同样的事情还是需要任何其他 python 工具。

标签: python abstract-syntax-tree parser-generator ebnf grako


【解决方案1】:

语言看起来很简单。您应该阅读一些关于parsing 的内容,以了解您必须做什么,无论是哪种编程语言。

PyParsing 在 Python 程序员中很流行。我认为 Grako(我是作者)对于初学者来说太复杂了,无法解析。

【讨论】:

  • 我如何设法使用 grako 解析文件。所以现在我有 AST 和 JSON 数据结构。但现在我想编辑 AST 并重新生成文件。 grako 会做同样的事情还是需要任何其他 python 工具。
  • Grako ASTs 有自己的特质,但事实上,它们是可以修改的。如果您选择这样做,请查看 grako.codegen 模块和捆绑的示例 (antlr2grako),了解 Grako 的标准翻译方式(不必是其他语言)。您还可以将 JSON 与 Python 的 json 模块一起使用,以使 AST 以标准数据结构表示,您可以使用它来做任何您想做的事情。
  • 我已经使用 grako.codegen 从 AST 生成文件。但是生成的文件没有正确缩进。并且也无法编辑 AST 树。可以分享一些示例来实现上述目标。
  • 使用 grako.util.asjson() 将 AST 转换为标准 Python 数据类型。然后你就可以随意操作结构了。
  • 感谢您提出 pyparsing 的建议。不管使用什么解析库,我总是建议开发人员至少写一个粗略的BNF。它不必是严格的 BNF 语法,任何类型的解析器计划总比没有好。您可以查看 BNF 本身的一致性和歧义性,这在您开始编写解析器之前就可以解决。 BNF 还将帮助您在编写解析器时跟踪您的进度,包括非常有价值的“花里胡哨检测”和“知道何时完成”。
猜你喜欢
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多