我想选择这个词 "String"
从线路上 "String helloString String Stringhello helloStringhello"
.
这里应该选两个字” String
“(第一和中间)
" String
“在” helloString
“或” Stringhello
“或” helloStringhello
“不应该被选中。
这是我的回复:
<YYINITIAL> (String) {return new Token(TokenType.String,yytext());}
但它可以选择任何单词“string”。
我的jlex代码:
import java.io.*;
enum TokenType {Type_String,Identifier}
class Token{
String text;
TokenType type;
Token(TokenType type,String text)
{
this.text=text;
this.type=type;
}
public String toString()
{
return String.format("[%s,%s]",type,text);
}
}
%%
%class Lexer
%public
%function getNextToken
%type Token
%{
public static void main(String[] args) throws IOException {
FileReader r = new FileReader("in.txt");
Lexer l = new Lexer(r);
Token tok;
while((tok=l.getNextToken())!=null){
System.out.println(tok);
}
r.close();
}
%}
%line
%char
SPACE=[\r\t\n\f\ ]
ALPHA=[a-zA-Z]
DIGIT=[0-9]
ID=({ALPHA}|_)({ALPHA}|{DIGIT}|_)*
%%
<YYINITIAL> {ID} {return new Token(TokenType.Identifier,yytext());}
<YYINITIAL> (String) {return new Token(TokenType.Type_String,yytext());}
<YYINITIAL> {SPACE}* {}
<YYINITIAL> . {System.out.println("error - "+yytext());}
3条答案
按热度按时间a64a0gku1#
如果我在示例输入上运行您的代码,我看不到您描述的行为。文字
helloString
等不被识别为类型的标记Type_String
,但作为类型的标记Identifier
,我认为这是预期的行为。所以这部分实际上工作得很好。不好用的是
String
它本身也被识别为一个标识符。其原因是,如果两个规则可以产生相同长度的匹配,则选择最先出现的规则。在定义字符串关键字的规则之前,您已经定义了标识符的规则,所以总是选择它。如果你改变这两条规则,String
其本身将被视为Type_String
其他一切都会被识别为一个标识符。kmbjn2e32#
我不知道您使用的编译器语言,但我可以用java给您提供解决方案。在java中,可以使用正则表达式,
(?<!\S)String(?=\s|$)
这意味着String
不在前面加上(称为负向后看,由指定)?<!
)非空白字符(即。\S
)后跟(称为正向前瞻,由指定)?=
)空白字符(即。\s
)或(即。|
)字符串的结尾(即“$”)。输出:
l7wslrjt3#
这是我的第二个jlex代码:
这是输入