我需要一个识别令牌结尾的函数,这样我就可以在其中保存一个数组并将其发送到我的自动机进行识别(操作员,关键字,标识符)
当我只输入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 :(得分:2)
假设评论在之前的传递中被删除。
现在你可以点击空格,字母,数字或标点字符。
空格既不是令牌,也不是解析器忽略的伪/空标记。
信函必须是标识符的一部分。这包括一个字母(或下划线,那里的小曲线球),后跟零个或多个字母或数字。除了下划线之外的空格或标点符号终止该标记。
数字必须是数字的一部分。规则有点复杂,在0之前表示ocatal(过时),在0x之前表示十六进制,1-9表示十进制。允许使用后缀,因为科学记数法。但任意[标点符号或空格终止数字。
对于一元 - ,++,< =,+ =和其他化合物,几乎没有繁琐的规则。这些代币没有附加价值。 ++总是++。
字符串是下一个大问题,因为引号可以被转义。
但那是关于它的。为C源构建词法分析器并不难。
(请参阅MiniBasic以了解如何为简单语言编写简单但功能齐全的递归下降解析器。 https://sourceforge.net/projects/minibasic/files/?source=navbar)
答案 1 :(得分: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
}
这里是分割标记的函数,使用puts()而不是lex()来查看结果
注意:lex()是我制作的词法分析器函数,它将令牌作为参数并返回其类型(常量,标识符,关键字,算术运算符,逻辑运算符......)