从来没写过的我,留个记号吧

从来没写过的我,留个记号吧!
词法分析是编译原理的重要概念之一,主要作用是将输入的源代码字符串转换为记号流。在Qt中,我们可以使用Qt的工具类QRegularExpression和QString来实现一个简单的词法分析器。 首先,我们需要定义一些正则表达式来匹配不同的记号类型。假设我们的词法分析器需要识别以下记号类型:标识符、关键字(如if、else等)、操作符(比如+、-等)、分隔符(如逗号、括号等)以及常数(包括整数和浮点数)。 接下来,我们可以使用QRegularExpression定义这些正则表达式,如下所示: QRegularExpression identifierRegex("[a-zA-Z_][a-zA-Z0-9_]*"); QRegularExpression keywordRegex("if|else|while|for"); QRegularExpression operatorRegex("<=|>=|==|!=|&&|\\|\\||[+\\-*/]"); QRegularExpression delimiterRegex("[(),]"); QRegularExpression numberRegex("\\d+(\\.\\d+)?"); 然后,我们可以定义一个函数来对输入的源代码字符串进行词法分析。函数以源代码字符串作为参数,按照正则表达式匹配记号并输出结果。具体实现如下: void lexicalAnalysis(const QString& sourceCode) { QRegularExpressionMatchIterator i; // 定义不同类型的记号的正则表达式 QRegularExpression identifierRegex("[a-zA-Z_][a-zA-Z0-9_]*"); QRegularExpression keywordRegex("if|else|while|for"); QRegularExpression operatorRegex("<=|>=|==|!=|&&|\\|\\||[+\\-*/]"); QRegularExpression delimiterRegex("[(),]"); QRegularExpression numberRegex("\\d+(\\.\\d+)?"); // 对源代码字符串进行词法分析 QString remainingCode = sourceCode; while (!remainingCode.isEmpty()) { // 分别匹配不同的正则表达式 i = identifierRegex.globalMatch(remainingCode); if (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString token = match.captured(); qDebug() << "Identifier: " << token; remainingCode = remainingCode.mid(match.capturedLength()); continue; } i = keywordRegex.globalMatch(remainingCode); if (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString token = match.captured(); qDebug() << "Keyword: " << token; remainingCode = remainingCode.mid(match.capturedLength()); continue; } i = operatorRegex.globalMatch(remainingCode); if (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString token = match.captured(); qDebug() << "Operator: " << token; remainingCode = remainingCode.mid(match.capturedLength()); continue; } i = delimiterRegex.globalMatch(remainingCode); if (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString token = match.captured(); qDebug() << "Delimiter: " << token; remainingCode = remainingCode.mid(match.capturedLength()); continue; } i = numberRegex.globalMatch(remainingCode); if (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString token = match.captured(); qDebug() << "Number: " << token; remainingCode = remainingCode.mid(match.capturedLength()); continue; } break; } } 最后,我们可以调用lexicalAnalysis函数,并传入源代码字符串进行词法分析: QString sourceCode = "int a = 10; if (a > 5) { qDebug() << \"a is greater than 5\"; }"; lexicalAnalysis(sourceCode); 运行以上代码,将会输出记号的类型和内容,如: Identifier: int Identifier: a Operator: = Number: 10 Keyword: if Delimiter: ( Identifier: a Operator: > Number: 5 Delimiter: ) Delimiter: { Identifier: qDebug Operator: << Operator: " a is greater than 5 Operator: " Delimiter: ; Delimiter: } 通过以上例子,我们可以看到词法分析器成功识别了源代码字符串中的各个记号类型,并输出相应的结果。当然,这只是一个简单的示例,实际的词法分析器还可以进一步扩展,识别更多的记号类型,并实现更复杂的匹配规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值