民间 我正在实现一个奇怪的事情,我必须编写一个实用程序来解析纯文本格式的语法图并将其转换为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等,以便遍历整个图表以模拟人类肉眼的理解过程。这听起来不够熟练,我没有想出其他更好的方法。 有人曾经玩过类似的场景吗?也许你可以对此有所了解。
提前谢谢!
答案 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符号序列:
>>
......等按照眼球顺序排列图表。
一旦有了1D符号序列,就可以使用传统的解析技术。
答案 1 :(得分:1)
访问单个字符的“字符网格”理念似乎是一个基础步骤; 另一个答案显示如何做到这一点就好了。现在,您可以随机访问网格,并轻松跟随水平或垂直线。
真正的问题是你想构建一个表示字符网格所说内容的图表。这样的图形将由(duh),节点,弧和注释组成。
可能最容易找到的是节点,这些节点可能由表示图中分支点的字符指示(参见其他答案)(例如 + )。每个弧将是一串字符,通向弧形或另一个节点。跟随这些字符串应该是相当直接的(:-))并且可以产生表示弧的字符串,即使它已经在其中弯曲。
您可能想要枚举所有节点(只扫描数组)。节点注释 必须合理地在附近,你可以简单地扫描节点位置周围的一小部分。
您需要枚举离开节点的每个弧,并收集表示弧的字符串。
我将弧形弦线送到词法分析器将其撕开;它可能有有趣的内容(例如,内联字符序列中的注释)。
此时,您有节点和弧以及相关的注释。从这些构造相应的图表应该非常简单。