我们正在为我们的学校项目制作 LolCode 解释器。我们在对解释器的词法分析器进行编码时遇到了麻烦。
// I HAS A <variable>
if(/(I\sHAS\sA)\s[a-zA-Z_$][0-9a-zA-Z_$]*$/i.test(entry)){
if(/(I\sHAS\sA)\s[a-zA-Z_$][0-9a-zA-Z_$]*/i.test(entry)){
var desc = "Variable Declaration";
var lex = /I\sHAS\sA/i.exec(entry);
$('#lexemes tbody').append('<tr><td>' + lex + '</td><td>' + desc + '</td></tr>');
}
if(/(I\sHAS\sA)\s[a-zA-Z_$][0-9a-zA-Z_$]*/i.test(entry)){
var string = /(I\sHAS\sA)\s[a-zA-Z_$][0-9a-zA-Z_$]*/i.exec(entry);
var desc = "Variable name";
var lex = /[^(I\sHAS\sA)\s]+/.exec(string);
$('#lexemes tbody').append('<tr><td>' + lex + '</td><td>' + desc + '</td></tr>');
}
}
// I HAS A <variable> ITZ <value>
if(/(I\sHAS\sA)\s[a-zA-Z_$][0-9a-zA-Z_$]*\sITZ\s.*/i.test(entry)){
if(/(I\sHAS\sA)\s[a-zA-Z_$][0-9a-zA-Z_$]*\sITZ\s.*/i.test(entry)){
var desc = "Variable Declaration";
var lex = /I\sHAS\sA/i.exec(entry);
$('#lexemes tbody').append('<tr><td>' + lex + '</td><td>' + desc + '</td></tr>');
}
if(/(I\sHAS\sA)\s[a-zA-Z_$][0-9a-zA-Z_$]*\sITZ\s.*/i.test(entry)){
var string = /(I\sHAS\sA)\s[a-zA-Z_$][0-9a-zA-Z_$]*\sITZ\s.*/i.exec(entry);
var desc = "Variable name";
var lex = /[^(I\sHAS\sA)\s]+/.exec(string);
$('#lexemes tbody').append('<tr><td>' + lex + '</td><td>' + desc + '</td></tr>');
}
if(/.+ITZ\s.*/i.test(entry)){
var string = /.+ITZ\s.*/i.exec(entry);
var desc = "Initialization";
var lex = /ITZ/i.exec(string);
$('#lexemes tbody').append('<tr><td>' + lex + '</td><td>' + desc + '</td></tr>');
}
}
它工作正常,但我的变量名正则表达式是错误的。我是正则表达式的新手,因此将不胜感激。
如果变量名具有“I”或“HAS”或“A”,则它不会被正则表达式捕获。
我知道这是因为,[^ ]
但如果我删除该部分,关键字I HAS A
将包含在变量名中。请帮助我改进我们的正则表达式。非常感谢!