简单的词法解析器

时间:2012-06-10 15:41:54

标签: c# .net state-machine

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

1)Word 2)数量 3)点和其他标点符号 4)“......”“!?” “!!!”等等

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

我希望找到类似的东西:

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

2 个答案:

答案 0 :(得分:3)

我建议使用正则表达式。像@"[a-zA-Z\-]+"这样的东西会拾取单词(a-z和短划线),而@"[0-9]*(\.[0-9]+)?"会拾取数字(包括十进制数字)。点等类似 - @"[!\.\?]+" - 你可以在方括号内添加所需的标点符号(用a转义特殊的正则表达式字符)。

作为词法分析者,

Poor man's "lexer" for C#非常接近你所寻找的。我建议谷歌搜索正则表达式的单词和数字或其他任何你需要的东西,找出你需要的表达式。

修改

或者看看Justin对特定正则表达式的回答。

答案 1 :(得分:2)

我们需要了解您认为单词或数字的具体内容。话虽这么说,我假设“单词”的意思是“C#式标识符”,“数字”的意思是“一串基数为10的数字,可能包括(但不是以小数点开头或结尾)。” / p>

根据这些定义,单词将与以下正则表达式匹配:

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

请注意这个would also match unicode。数字符合以下条件:

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

再次注意,这不包括十六进制,八进制或科学记数法,尽管您可以毫不费力地添加它。它也不包括numeric literal suffixes

匹配后,你可能会因为标点符号而逃脱:

@"[^\w\d\s]+"