解析字符语法图的想法

时间:2010-06-10 14:54:43

标签: python xml parsing

民间 我正在实现一个奇怪的事情,我必须编写一个实用程序来解析纯文本格式的语法图并将其转换为xml格式,这与IBM的基本相同(如“创建无转换作业” “部分): http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls17.htm 像ANTLR / yacc / bison这样的典型解析器/词法分析器似乎无法处理这种东西,我的一个想法是将语法图转换为字符位图并定义一些函数,如more_up,move_down,left,right等,以便遍历整个图表以模拟人类肉眼的理解过程。这听起来不够熟练,我没有想出其他更好的方法。 有人曾经玩过类似的场景吗?也许你可以对此有所了解。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

我之前从未做过这样的事情,但这就是我接近它的方式。

首先,我会从这样的事情开始:

class CharGrid(object):
    def __init__(self, text):
        self.lines = text.split('\n')

    def __getitem__(self, pos):
        try:
            col, row = pos
        except (TypeError, ValueError):
            raise KeyError('%r not a 2-tuple' % (pos,))
        if row >= len(self.lines):
            return ' '
        line = self.lines[row]
        if col >= len(line):
            return ' '
        return line[col]

这样我就可以通过2D坐标访问文本中的字符了:

grid = CharGrid("""Creating a No-Conversion Job

>>-onpladm create job--job--+--------------+-- -n--------------->
                            '- -p--project-'

>-- -d--device-- -D--database-- -t--table----------------------->

   .---------------------------------------------------------------------.
   V                                                                     |
>----+-----------------------------------------------------------------+-+-><
     |                                                            (1)  |
     '-+-------------+--+-------------+--| Setting the Run Mode |------'
       '- -S--server-'  '- -T--target-'
""")

print ''.join((grid[0,0], grid[1,0], grid[2,0]))
print ''.join((grid[0,2], grid[1,2]))

(产生)

Cre
>>

之后,任务是将2D网格字符转换为1D符号序列:

  1. 读取第一行的标签
  2. 向下扫描第一列,直至找到>>
  3. 从当前位置直接扫描,直到找到[无论如何]
  4. ......等按照眼球顺序排列图表。

    一旦有了1D符号序列,就可以使用传统的解析技术。

答案 1 :(得分:1)

访问单个字符的“字符网格”理念似乎是一个基础步骤; 另一个答案显示如何做到这一点就好了。现在,您可以随机访问网格,并轻松跟随水平或垂直线。

真正的问题是你想构建一个表示字符网格所说内容的图表。这样的图形将由(duh),节点,弧和注释组成。

可能最容易找到的是节点,这些节点可能由表示图中分支点的字符指示(参见其他答案)(例如 + )。每个弧将是一串字符,通向弧形或另一个节点。跟随这些字符串应该是相当直接的(:-))并且可以产生表示弧的字符串,即使它已经在其中弯曲。

您可能想要枚举所有节点(只扫描数组)。节点注释 必须合理地在附近,你可以简单地扫描节点位置周围的一小部分。

您需要枚举离开节点的每个弧,并收集表示弧的字符串。

我将弧形弦线送到词法分析器将其撕开;它可能有有趣的内容(例如,内联字符序列中的注释)。

此时,您有节点和弧以及相关的注释。从这些构造相应的图表应该非常简单。