简单的 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
我用 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