如何使用组名通过正则表达式实现高效的分词器



我正在尝试编写一个分词器,用于使用正则表达式解析文本正文(输入字符串(。我想要的是将输入拆分为单个令牌,并将其存储在List中,其中令牌是一个(C#(类,例如

class Token {
string value;
string type; // "identifier", "string', "intliteral', ... 
}

我想使用如下所示的正则表达式来拆分输入字符串:

public static Regex tokenPattern = new Regex (
@"
( (?<identifier>(?:p{L}|_)w*)
| (?<string>""[^""]*"")
| (?<intliteral>(?:-|+)?d+[^.])
| (?<realliteral>(?:-|+)?d+(?:.d+)?)
| (?<comma>,)
| (?<lpar>()
| (?<rpar>))
| ...
| (?<undefined>[^s]*?)
)
",
RegexOptions.ExplicitCapture |
RegexOptions.IgnorePatternWhitespace | 
...
);

我的问题是很容易获得每个 Token 的值部分,但似乎没有一种简单的方法来获取类型部分,即组名。我预计正则表达式组会有一个包含"标识符"等的Name属性,但事实似乎并非如此。

有没有办法在不迭代每个令牌的所有组名称/编号的情况下确定组名称?(即复杂度为 O(n( 而不是 O(nm( 的方法,输入字符串中有 n 个标记,m 个令牌类型(?

这将是一个多阶段操作,有一个正则表达式来执行这样的操作不会很好地利用处理器时间。我建议划分操作的各个阶段,例如:

  1. 使用基本正则表达式将每个值解析到令牌中。
  2. 具有特定操作来确定遇到的令牌类型,并相应地设置该值。

在第二步之后,您最必须继续打破这些步骤才能提高效率。


我必须同意这样一种观点,即正则表达式不是用于令牌语言处理的工具,而不是在识别单个令牌或在令牌过程中进行子识别令牌属性的工具。

最新更新