4

我特别感兴趣的是能够将代码中的语法定义为普通代码而没有任何不必要的麻烦。

我知道我可以使用 IronPython。我不想。

更新:

为了进一步解释我在寻找什么,我包含了一些示例 pyparsing 代码。这是一个不完整的解析器,用于将 emacs 快捷键转换为更传统的符号。当然,这个例子足够小,字符串函数就足够了,但这只是为了展示 pyparsing 的简洁性。

from pyparsing import Literal, OneOrMore, Optional, Word, printables, replaceWith

CTRL_MODIFIER = Literal('C').setParseAction(replaceWith('Ctrl'))
META_MODIFIER = Literal('M').setParseAction(replaceWith('Alt'))
MODIFIER = CTRL_MODIFIER | META_MODIFIER # Note operator overloading

SEPARATOR = Literal('-').setParseAction(replaceWith('+'))

MODIFIER_LIST = OneOrMore(MODIFIER + SEPARATOR)

KEY = Word(printables) # This is a "word" composed of any number of printable characters.

# The lambda functions here just join the tokens with the literal string 
# on which .join is called.
STROKE = (Optional(MODIFIER_LIST) + KEY).setParseAction(
    lambda tokens: ' '.join([str(token) for token in tokens]))
BINDING = OneOrMore(STROKE).setParseAction(
    lambda tokens: ', '.join([str(token) for token in tokens]))

# Example usage:
# >>> BINDING.transformString('M-/')
# Alt + /
# >>> BINDING.transformString('C-x C-f')
# Ctrl + x, Ctrl + f
# >>> BINDING.transformString('C-x f')
# Ctrl + x, f
# >>> BINDING.transformString('C-x M-c M-butterfly')
# Ctrl + x, Alt + c, Alt + butterfly

我希望能够在 .NET 中轻松地用几行代码编写语法。

4

3 回答 3

2

看看:Irony 它允许你在你的 C# 代码中定义你的语法

于 2009-09-22T13:04:03.077 回答
2

您可以尝试NParsec,但它似乎不再被积极开发。

于 2009-09-22T16:20:24.520 回答
1

OSLO 项目,在未来几年内不会发布,并且将成为 pyparsing 的过度设计版本。

于 2009-09-21T19:40:18.440 回答