在 JFlex 中执行操作之前检查条件是否满足
check if condition is met before executing the action in JFlex
我正在使用 JFlex 编写词法分析器。当单词 co
匹配时,我们必须忽略后面的内容,直到行尾(因为它是注释)。目前,我有一个布尔变量,只要匹配这个词,它就会更改为 true
,如果在 co
之后匹配标识符或运算符直到行尾,我只是忽略它,因为我在我的 Identifier
和 Operator
令牌标识中有一个 if
条件。
我想知道是否有更好的方法来做到这一点并摆脱这个无处不在的 if
语句?
代码如下:
%% // Options of the scanner
%class Lexer
%unicode
%line
%column
%standalone
%{
private boolean isCommentOpen = false;
private void toggleIsCommentOpen() {
this.isCommentOpen = ! this.isCommentOpen;
}
private boolean getIsCommentOpen() {
return this.isCommentOpen;
}
%}
Operators = [\+\-]
Identifier = [A-Z]*
EndOfLine = \r|\n|\r\n
%%
{Operators} {
if (! getIsBlockCommentOpen() && ! getIsCommentOpen()) {
// Do Code
}
}
{Identifier} {
if (! getIsBlockCommentOpen() && ! getIsCommentOpen()) {
// Do Code
}
}
"co" {
toggleIsCommentOpen();
}
. {}
{EndOfLine} {
if (getIsCommentOpen()) {
toggleIsCommentOpen();
}
}
实现此目的的一种方法是在 JFlex 中使用状态。我们说每次单词 co
匹配时,我们进入一个名为 COMMENT_STATE
的状态,直到行尾我们什么都不做。该行结束后,我们退出 COMMENT_STATE
状态。所以这是代码:
%% // Options of the scanner
%class Lexer
%unicode
%line
%column
%standalone
Operators = [\+\-]
Identifier = [A-Z]*
EndOfLine = \r|\n|\r\n
%xstate YYINITIAL, COMMENT_STATE
%%
<YYINITIAL> {
"co" {yybegin(COMMENT_STATE);}
}
<COMMENT_STATE> {
{EndOfLine} {yybegin(YYINITIAL);}
. {}
}
{Operators} {// Do Code}
{Identifier} {// Do Code}
. {}
{EndOfLine} {}
使用这种新方法,词法分析器更简单,也更易读。
我正在使用 JFlex 编写词法分析器。当单词 co
匹配时,我们必须忽略后面的内容,直到行尾(因为它是注释)。目前,我有一个布尔变量,只要匹配这个词,它就会更改为 true
,如果在 co
之后匹配标识符或运算符直到行尾,我只是忽略它,因为我在我的 Identifier
和 Operator
令牌标识中有一个 if
条件。
我想知道是否有更好的方法来做到这一点并摆脱这个无处不在的 if
语句?
代码如下:
%% // Options of the scanner
%class Lexer
%unicode
%line
%column
%standalone
%{
private boolean isCommentOpen = false;
private void toggleIsCommentOpen() {
this.isCommentOpen = ! this.isCommentOpen;
}
private boolean getIsCommentOpen() {
return this.isCommentOpen;
}
%}
Operators = [\+\-]
Identifier = [A-Z]*
EndOfLine = \r|\n|\r\n
%%
{Operators} {
if (! getIsBlockCommentOpen() && ! getIsCommentOpen()) {
// Do Code
}
}
{Identifier} {
if (! getIsBlockCommentOpen() && ! getIsCommentOpen()) {
// Do Code
}
}
"co" {
toggleIsCommentOpen();
}
. {}
{EndOfLine} {
if (getIsCommentOpen()) {
toggleIsCommentOpen();
}
}
实现此目的的一种方法是在 JFlex 中使用状态。我们说每次单词 co
匹配时,我们进入一个名为 COMMENT_STATE
的状态,直到行尾我们什么都不做。该行结束后,我们退出 COMMENT_STATE
状态。所以这是代码:
%% // Options of the scanner
%class Lexer
%unicode
%line
%column
%standalone
Operators = [\+\-]
Identifier = [A-Z]*
EndOfLine = \r|\n|\r\n
%xstate YYINITIAL, COMMENT_STATE
%%
<YYINITIAL> {
"co" {yybegin(COMMENT_STATE);}
}
<COMMENT_STATE> {
{EndOfLine} {yybegin(YYINITIAL);}
. {}
}
{Operators} {// Do Code}
{Identifier} {// Do Code}
. {}
{EndOfLine} {}
使用这种新方法,词法分析器更简单,也更易读。