简单的 MATLAB 词法分析器程序

Simple MATLAB lexer program

我用 MATLAB 代码创建了一个简单的词法分析器程序,当用户键入一个字符串时,该字符串中的词素就会被分类。但是,当我在命令 window 中输入字符串时,标识符没有显示。

代码如下:

function determineLexemes()
   j = 0;
   prompt = 'Enter string : ';
   str = input(prompt);
   arr = char(str);
   strTwo = '';
   display('Symbol Table');
   fprintf('Lexeme \t\t Token \n');
   k = length(arr);
   for i = 1: k
     if(arr(i) == '+')
       fprintf('+ \t\t ADD_OP \n');
     end
    if(arr(i) == '-')
       fprintf('- \t\t SUB_OP \n');
    end
    if(arr(i) == '*')
       fprintf('* \t\t MULT_OP \n');
    end
    if(arr(i) == '/')
       fprintf('/ \t\t DIV_OP \n');
    end
   if(arr(i) == '(')
      fprintf('( \t\t LEFT_PAREN \n');
   end
   if(arr(i) == ')')
      fprintf(') \t\t RIGHT_PAREN \n');
   end
   if(arr(i) == '=')
      fprintf('= \t\t EQUAL_OP \n');
   end


   x = str2num(arr(i));
   y = isletter(arr(i));


   if(y || (isempty(x) ==0))
      strTwo = strcat(strTwo,arr(i));
   end


   if(~ischar(arr(i)) && ~isnumeric(arr(i)))
      if(~isspace(arr(i)) && ~isempty(strTwo))
           m(j) = strTwo;

           if(isNumeric(strTwo(1)) && regexp('.*[a-zA-]+.*'))
               disp(strcat('Error. Potential variable (', strTwo, ') whose name starts with digit found'));
               strTwo = '';
               j = j + 1;
           end
           if(~(isNumeric(strTwo(1) && regexp('.*[a-zA-]+.*'))))
               disp(strcat(m(j), ('\t\t IDENTIFIER')));
               strTwo = '';
               j = j + 1;   
           end 
       end
    end 
 end
end

当向用户提示输入“(2a + b)”时,预期输出如下:

但是,输出当前不识别标识符(即本例中的 2a 和 b)。

感谢任何对此问题的帮助。

我试图将您的代码所需的更改保持在最低限度,但是出现了很多错误(甚至 isNumeric 而不是 isnumeric 或缺少 regex函数)。 希望您对此感到满意。

function determineLexemes()
   j = 1;
   prompt = 'Enter string : ';
   str = input(prompt);
   arr = char(str);
   strTwo = '';
   display('Symbol Table');
   fprintf('Lexeme \t\t Token \n');
   k = length(arr);
   for i = 1: k
     if(arr(i) == '+')
       fprintf('+ \t\t ADD_OP \n');
     end
    if(arr(i) == '-')
       fprintf('- \t\t SUB_OP \n');
    end
    if(arr(i) == '*')
       fprintf('* \t\t MULT_OP \n');
    end
    if(arr(i) == '/')
       fprintf('/ \t\t DIV_OP \n');
    end
   if(arr(i) == '(')
      fprintf('( \t\t LEFT_PAREN \n');
   end
   if(arr(i) == ')')
      fprintf(') \t\t RIGHT_PAREN \n');
   end
   if(arr(i) == '=')
      fprintf('= \t\t EQUAL_OP \n');
   end


   x = str2num(arr(i));
   y = isletter(arr(i));


   if(y || ~isempty(x))
      strTwo = strcat(strTwo,arr(i));
   end

  if(~isspace(arr(i)) && ~isempty(strTwo))
       if(~isempty(str2num(strTwo(1))) && any(regexp(strTwo,'.*[a-zA-]+.*')))
           fprintf(strcat('Error. Potential variable (', strTwo, ') whose name starts with digit found \n'));
           strTwo = '';
           j = j + 1;
       else
        if isempty(str2num(strTwo(1)))
           fprintf(strcat(strTwo, ('\t\t IDENTIFIER \n')));
           strTwo = '';
           j = j + 1;   
        end
       end
  end
  end
end