我特别感兴趣的是在代码中定义语法的能力,而不需要任何不必要的繁琐操作。
我知道我可以使用IronPython,但我不想这样做。
更新:
为了进一步解释我的需求,我包含了一些pyparsing代码示例。这是一个不完整的解析器,用于将emacs快捷键转换为更常规的符号表示法。当然,这个例子足够小,可以使用字符串函数来完成,但它只是展示pyparsing的简洁性和简洁性。
我希望能够轻松地用尽可能少的代码在.NET中编写语法规则。
我知道我可以使用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中编写语法规则。