您的位置:首页 > 其它

分词驱动的parser vs. meta character驱动

2015-10-26 12:47 218 查看
字符分为

alphabet character

meta character

主框架就是分词,分出一个词做什么处理的问题,这个是根据当前的状态。而meta character主要就是决定状态。比如json parser,当分出一个词后,如果当前处在一个list的scope里,(之前出现过"[",还未出现"]"),那就parent.append(word),如果当前处在一个dict里,且在key的部分,则记录key = word,如果在value的部分,则parent[key] = word

[, ], {, }, : 等meta character主要就是负责更新scope、状态。引号的意思是强制分词,即不用自己分词,而是强制两个引号之间的字符串,有特殊字符也好,有空白也好都不管,作为一个word。

而meta character驱动的事件是出现了一个什么语法字符(:,{}等)然后做什么处理的问题,其实差不多,meta character驱动更全面一些,和分词也不矛盾,分词是给出当前数据,语法字符判断、更新状态。另一个版本的json parser, 分词驱动的思想:

def parseJson(json):
stack, meta, wordStart, inQuote, key = [[]], '[]{},: \t"', -1, False, [None]
def handle(item):
if isinstance(item, str):
if item.isdigit(): item = int(item) #convert to int if item is literal value and all numbers
elif item[0] == '"': item = item[1: -1]
if isinstance(stack[-1], list): stack[-1].append(item) #container is list
elif key[0] is None: key[0] = item
else:
stack[-1][key[0]] = item
key[0] = None
if isinstance(item, list) or isinstance(item, dict): stack.append(item)
for i in xrange(len(json)):
if inQuote:
if json[i] == '"':
handle(json[wordStart: i + 1])
inQuote = False
elif json[i] not in meta:
if i == 0 or json[i - 1] in meta: wordStart = i
if i == len(json) - 1 or json[i + 1] in meta: handle(json[wordStart: i + 1])
elif json[i] == '"':
inQuote = True
wordStart = i
elif json[i] in '{[': handle([] if json[i] == '[' else {})
elif json[i] in ']}':
stack.pop()
return stack[-1][0] if len(stack[-1]) > 0 else None
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: