如何在javacc中将变量与令牌匹配?

时间:2018-05-03 11:11:31

标签: token javacc

我正在尝试将变量(字符串)与我在JAVACC中定义的标记之一进行匹配。我正在尝试做的伪代码是......

String x;
if (x matches <FUNCTIONNAME>) {...}

我将如何实现这一目标?

谢谢

1 个答案:

答案 0 :(得分:1)

这是一种方法。使用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 ; 
}

这样做的一个问题是它会跳过声明为SKIPSPECIAL_TOKEN的令牌。例如。如果我使用Java词法分析器,那么"/*hello*/\tworld // \n"仍将匹配JavaParserConstants.ID。如果你不想要这个,你需要做两件事。首先进入.jj文件并将所有SKIP令牌转换为SPECIAL_TOKENS。第二次添加检查没有找到特殊令牌

matches = a.kind == k && b.kind == 0 && a.specialToken == null && b.specialToken == null ;