2016-12-30 44 views
-1

我需要一个识别令牌末尾的函数,以便我可以将它保存在一个数组中并将其发送到我的自动装置进行识别(操作员,关键字,标识符)词法分析器:如何识别令牌的末尾

当我只输入1个令牌时,自动机工作的很好,但是当有许多令牌包括空格时,它不起作用,我需要这个函数来删除空格,并在每个令牌的末尾停止并发送每个令牌阵列到我的自动机功能,我'卡住..

我'用C

例如:ABC + d

:ABC令牌1

:+令牌2​​

:d令牌3

EX2:ABC++ D12 */Z(ABC,+,+,D12,*,/,Z )7个令牌 EX3:AD ++ - C(AD,+,+, - ,C)5个令牌

编辑:我'不使用任何工具,只有c与确定性有限自动机

+0

你在使用什么词汇分析工具?他们通常使用正则表达式来识别令牌。 – Barmar

回答

0
void lirelexeme(char chaine[500]){ 
int i,j=0,k; 
char tc,tc2;    
char lexeme[500];memset(lexeme,0,500); 

for(i=0;i<length;i++){ 
tc=chaine[i]; // terme courant 
tc2=chaine[i+1]; // terme suivant 

if(tc!=' ' && tc!='\0' && tc!='\n'&& tc!='\t'){ 

if((tc==':' && tc2=='=') || (tc=='>' && tc2=='=') || (tc=='<' && tc2=='=') || (tc=='<' && tc2=='>')){ // ex: a:=/>=/<= 
lexeme[0]=tc; 
lexeme[1]=tc2; 
lex(lexeme); 
memset(lexeme,0,500); 
j=0; // préparer pour recevoir le nouveau lexeme 
i++; // on évite de prendre tc2 
} 

这里是将分割标记的功能,使用看跌期权()代替()是看到结果

注意:lex()是我做的词法分析器函数,它将把token作为参数并给你返回它的类型(常量,标识符,关键字,算术运算符,逻辑运算符)。 ..)

2

假设评论在较早的通行证中被剥夺。

现在你打了空白,一个字母,一个数字或一个标点符号。

空白或者不是标记,或者是解析器忽略的哑/空标记。

一个字母必须是标识符的一部分。它由一个字母(或下划线,那里的小曲线球),零个或多个字母或数字组成。除下划线以外的空格或标点符号会终止该标记。

数字必须是数字的一部分。规则有点复杂,前面的0表示ocatal(过时),前面的0x表示十六进制,1-9表示十进制。后缀是允许的,科学记数法也是如此。但任意的[标点符号或空白字符终止数字。对于一元 - ,++,< =,+ =和其他化合物有一点烦琐的规则。 Bu这些令牌没有附加值。 ++总是++。

字符串是下一个大问题,因为引号可以被转义。

但就是这样。为C源构建一个词法分析器并不难。

(见MiniBasic了解如何编写一个简单但功能齐全的递归下降解析器的简单语言。 https://sourceforge.net/projects/minibasic/files/?source=navbar

相关问题