设计词法分析器,识别下列单词符号,把词法分析器安排成一个子程序,每当语法分析器需要一个单词符号时就调用这个子程 序。每次调用,词法分析器就从输入串中识别出一个单词符号,把它交给语法分析器
时间: 2023-11-12 17:05:32 浏览: 36
好的,我可以为你介绍一下设计词法分析器的基本思路。词法分析器主要是对输入的字符串进行扫描,将其中的单词符号逐个识别出来,并返回给语法分析器。下面是一个简单的示例,用于识别四个单词符号:if、else、while、do。
1. 首先,需要定义四个单词符号的正则表达式模式。
- if:\bif\b
- else:\belse\b
- while:\bwhile\b
- do:\bdo\b
其中,\b 表示单词的边界,确保只匹配整个单词,而不是单词的一部分。
2. 接着,定义一个词法分析器的子程序,用于从输入串中识别单词符号。
```
function lex(){
var token;
var patterns = [
{regex: /\bif\b/, type: 'IF'},
{regex: /\belse\b/, type: 'ELSE'},
{regex: /\bwhile\b/, type: 'WHILE'},
{regex: /\bdo\b/, type: 'DO'}
];
for(var i = 0; i < patterns.length; i++){
var match = input.match(patterns[i].regex);
if(match){
token = {type: patterns[i].type, value: match[0]};
input = input.substr(match[0].length);
break;
}
}
return token;
}
```
该子程序接受一个输入串 input,然后根据预定义的正则表达式模式进行匹配,如果匹配成功,则返回一个包含单词符号类型和值的 token 对象,并将输入串中已识别的部分截取掉。如果没有匹配成功,则返回 undefined。
3. 最后,在语法分析器中调用该子程序,获取下一个单词符号。
```
var input = 'if (x < y) { x = y } else { y = x }';
var lookahead = lex();
while(lookahead){
switch(lookahead.type){
case 'IF':
// 处理 if 语句
break;
case 'ELSE':
// 处理 else 语句
break;
case 'WHILE':
// 处理 while 循环语句
break;
case 'DO':
// 处理 do-while 循环语句
break;
default:
// 处理错误情况
break;
}
lookahead = lex();
}
```
在语法分析器中,先调用 lex() 子程序获取下一个单词符号,然后根据不同的单词符号类型进行相应的处理。处理完当前单词符号后,再调用 lex() 子程序获取下一个单词符号,直到所有单词符号都处理完毕。