WEB开发网
开发学院软件开发Python 了解 DParser for Python 阅读

了解 DParser for Python

 2007-03-29 12:13:45 来源:WEB开发网   
核心提示: 尽管如此,还是有很多读者推荐说用于 Python DParaser 值得关注,了解 DParser for Python(2),虽然我更喜欢单独的 EBNF 定义,顺便提一句,所有没有被包括进来的单词只是短语的“head”或“tail”的部分

尽管如此,还是有很多读者推荐说用于 Python DParaser 值得关注,虽然我更喜欢单独的 EBNF 定义。顺便提一句,如您将在示例中所看到的,DParser 不使用任何单独的标记传递,而只是直接解析。您可以通过定义保留的 d_whitespace() 函数来控制空格的识别(它分离解析符号);这样就使得您可以随意使用标记。

找到最长的结果

作为用于 Python 的 DParser 程序的第一个示例,我创建了一个查找几个模式的语法,这些模式依次为另一个的子结果。这个语法处理的问题类似于很多解析器遇到的“dangling else”问题。具体说,也就是您如何才能知道什么时候停止查找更长的结果?(例如,“if”后是否跟有“else”?)我的语法会去分析的短语可能按次序包括有以“a”、“b”和“c” 结尾的单词。所有没有被包括进来的单词只是短语的“head”或“tail”的部分。这需要一些例子来展示。首先,程序本身:

清单 1. 解析器 abc.py

#!/usr/bin/env python2.3
"Identify sequence of a-, b-, c- words"
#
#-- The grammar
def d_phrase(t, s):
  'phrase : words ( ABC | AB | A ) words'
  print "Head:", ''.join(s[0])
  print t[1][0]+":", ''.join(s[1])
  print "Tail:", ''.join(s[2])
def d_words(t):
  'words : word*'
def d_word(t):
  'word : "[a-z]+" '
def d_A(t):
  '''A : "a[a-z]*" '''
  return 'A'
def d_AB(t):
  '''AB : A "b[a-z]*" '''
  return 'AB'
def d_ABC(t):
  '''ABC : AB "c[a-z]*" '''
  return 'ABC'
#
#-- Parse STDIN
from dparser import Parser
from sys import argv, stdin
phrase, arg = stdin.read(), argv[-1]
Parser().parse(phrase,
        print_debug_info=(arg=='--debug'))

上一页  1 2 3 4 5 6 7  下一页

Tags:了解 DParser for

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接