2015-12-29 2 views
0

Я создал простую лексерскую программу из кода MATLAB, где, когда пользователь набирает строку, лексемы в этой строке классифицируются. Однако при вводе строки в командном окне идентификаторы не отображаются.Simple MATLAB lexer program

Код выглядит следующим образом:

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 

и предполагаемый выход, когда '(2а + Ь)' вводится в пользовательской строке, выглядит следующим образом:

enter image description here

Тем не менее, в настоящий момент на выходе не идентифицируются идентификаторы (например, 2a и b в этом примере).

Любая помощь по этой проблеме оценивается.

ответ

0

Я попытался свести к минимуму изменения, необходимые вашему коду, но было довольно много ошибок (даже такие вещи, как 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 
+0

Большое спасибо Prahken. Теперь работает. – user3023315

+0

@ user3023315 Добро пожаловать. – Prahken