如何将变量与 javacc 中的标记匹配?
How to match a variable to a token in javacc?
我正在尝试将变量(字符串)与我在 JAVACC 中定义的标记之一相匹配。我正在尝试做的伪代码是...
String x;
if (x matches <FUNCTIONNAME>) {...}
我将如何实现这一目标?
谢谢
这是一种方法。使用 STATIC==false
选项。以下代码应该可以满足您的需求
public boolean matches( String str, int k ) {
// Precondition: k should be one of the integers
// given a name in XXXConstants
// Postcondition: result is true if and only if str would be lexed by
// the lexer as a single token of kind k possibly
// preceeded and followed by any number of skipped and special tokens.
StringReader sr = new StringReader( str ) ;
SimpleCharStream scs = new SimpleCharStream( sr ) ;
XXXTokenManager lexer = new XXXTokenManager( scs );
boolean matches = false ;
try {
Token a = lexer.getNextToken() ;
Token b = lexer.getNextToken() ;
matches = a.kind == k && b.kind == 0 ; }
catch( Throwable t ) {}
return matches ;
}
一个问题是它会跳过声明为 SKIP
或 SPECIAL_TOKEN
的标记。例如。如果我使用 Java 词法分析器,那么 "/*hello*/\tworld // \n"
仍然会匹配 JavaParserConstants.ID
。如果你不想要这个,你需要做两件事。首先进入 .jj 文件并将任何 SKIP
标记转换为 SPECIAL_TOKENS
。第二个添加检查没有找到特殊标记
matches = a.kind == k && b.kind == 0 && a.specialToken == null && b.specialToken == null ;
我正在尝试将变量(字符串)与我在 JAVACC 中定义的标记之一相匹配。我正在尝试做的伪代码是...
String x;
if (x matches <FUNCTIONNAME>) {...}
我将如何实现这一目标?
谢谢
这是一种方法。使用 STATIC==false
选项。以下代码应该可以满足您的需求
public boolean matches( String str, int k ) {
// Precondition: k should be one of the integers
// given a name in XXXConstants
// Postcondition: result is true if and only if str would be lexed by
// the lexer as a single token of kind k possibly
// preceeded and followed by any number of skipped and special tokens.
StringReader sr = new StringReader( str ) ;
SimpleCharStream scs = new SimpleCharStream( sr ) ;
XXXTokenManager lexer = new XXXTokenManager( scs );
boolean matches = false ;
try {
Token a = lexer.getNextToken() ;
Token b = lexer.getNextToken() ;
matches = a.kind == k && b.kind == 0 ; }
catch( Throwable t ) {}
return matches ;
}
一个问题是它会跳过声明为 SKIP
或 SPECIAL_TOKEN
的标记。例如。如果我使用 Java 词法分析器,那么 "/*hello*/\tworld // \n"
仍然会匹配 JavaParserConstants.ID
。如果你不想要这个,你需要做两件事。首先进入 .jj 文件并将任何 SKIP
标记转换为 SPECIAL_TOKENS
。第二个添加检查没有找到特殊标记
matches = a.kind == k && b.kind == 0 && a.specialToken == null && b.specialToken == null ;