简单的词法解析器

本文关键字:词法 简单 | 更新日期: 2023-09-27 18:36:39

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

1) 单词2) 编号3)点和其他标点符号4) '"...'"'"!?'"!!"等等

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

我希望找到类似的东西:

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

简单的词法解析器

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

Poor man 的 C# "词法分析器"非常接近你正在寻找的东西,就词法分析器而言。我建议在谷歌上搜索单词和数字或其他任何你需要的正则表达式,以找出你到底需要什么表达式。

编辑

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

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

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

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

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

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

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

匹配这些之后,您可能会侥幸使用标点符号:

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