2

我想为常规文本编写一个词法解析器。所以我需要检测以下令牌:

1) 单词 2) 数字 3) 点和其他标点符号 4) “...” “!?” “!!!” 等等

我认为为每个项目写“if else”条件并非易事。那么是否有任何用于 c# 的有限状态机生成器?我知道 ANTLR 和其他工具,但我会尝试学习如何使用这些工具,但我可以编写自己的“ifelse”FSM。

我希望找到类似的东西:

FiniteStateMachine.AddTokenDefinition(":)","smile");
FiniteStateMachine.AddTokenDefinition(".","dot");
FiniteStateMachine.ParseText(text);
4

2 回答 2

3

我建议使用正则表达式。类似的东西@"[a-zA-Z\-]+"会选择单词(az 和破折号),而@"[0-9]*(\.[0-9]+)?"会选择数字(包括十进制数字)。点等类似 - @"[!\.\?]+"- 您可以在方括号内添加所需的任何标点符号(用 转义特殊的正则表达式字符)。

就成为词法分析器而言,C# 的穷人的“词法分析器”非常接近您正在寻找的东西。我建议在谷歌上搜索单词和数字的正则表达式或其他任何你需要的表达式,以找出你真正需要的表达式。

编辑

或者查看贾斯汀对特定正则表达式的回答。

于 2012-06-10T16:16:54.413 回答
2

我们需要知道你认为一个词或一个数字的细节。话虽如此,我假设“word”表示“C# 风格的标识符”,“number”表示“一串以 10 为基数的数字,可能包括(但不以小数点开头或结尾)”。

根据这些定义,单词可以是与以下正则表达式匹配的任何内容:

@"\b(?!\d)\w+\b"

请注意,这也将匹配 unicode。数字将匹配以下内容:

@"\b\d+(?:\.\d+)?\b"

再次注意,这不包括十六进制、八进制或科学记数法,尽管您可以毫不费力地添加它们。它也不包括数字文字后缀

在匹配这些之后,您可能可以摆脱标点符号:

@"[^\w\d\s]+"
于 2012-06-10T16:13:35.443 回答