我很喜欢pyPEG http://fdik.org/pyPEG/。它的错误报告不是很友好,但它可以将源代码位置添加到 AST。
pyPEG 没有单独的词法分析器,这会使解析 Python 本身变得困难(我认为 CPython 可以识别词法分析器中的缩进和缩进),但我使用 pyPEG 为 C# 子集构建了一个解析器,工作量出奇的少。
改编自的一个例子fdik.org/pyPEG/ http://fdik.org/pyPEG/:像这样的简单语言:
function fak(n) {
if (n==0) { // 0! is 1 by definition
return 1;
} else {
return n * fak(n - 1);
};
}
该语言的 pyPEG 解析器:
def comment(): return [re.compile(r"//.*"),
re.compile("/\*.*?\*/", re.S)]
def literal(): return re.compile(r'\d*\.\d*|\d+|".*?"')
def symbol(): return re.compile(r"\w+")
def operator(): return re.compile(r"\+|\-|\*|\/|\=\=")
def operation(): return symbol, operator, [literal, functioncall]
def expression(): return [literal, operation, functioncall]
def expressionlist(): return expression, -1, (",", expression)
def returnstatement(): return keyword("return"), expression
def ifstatement(): return (keyword("if"), "(", expression, ")", block,
keyword("else"), block)
def statement(): return [ifstatement, returnstatement], ";"
def block(): return "{", -2, statement, "}"
def parameterlist(): return "(", symbol, -1, (",", symbol), ")"
def functioncall(): return symbol, "(", expressionlist, ")"
def function(): return keyword("function"), symbol, parameterlist, block
def simpleLanguage(): return function