gpt4 book ai didi

JavaCC 词法分析器未按预期工作(未忽略空格)

转载 作者:行者123 更新时间:2023-11-29 05:48:20 26 4
gpt4 key购买 nike

我正在尝试为下面列出的示例文件实现解析器。我想用 '+' 识别带引号的字符串它们之间作为一个标记。所以我创建了一个 jj 文件,但是它不匹配这样的字符串。我的印象是 JavaCC 应该为每个 token 规范匹配最长的可能匹配项。但这对我来说似乎并非如此。

我在这里做错了什么?为什么不是我的 <STRING>'+' 匹配的标记即使它在那里指定?为什么不忽略空格?

options {
TOKEN_FACTORY = "Token";
}

PARSER_BEGIN(Parser)

package com.example.parser;

public class Parser {

public static void main(String args[]) throws ParseException {

ParserTokenManager manager = new ParserTokenManager(new SimpleCharStream(Parser.class.getResourceAsStream("example")));
Token token = manager.getNextToken();
while (token != null && token.kind != ParserConstants.EOF) {
System.out.println(token.toString() + "[" + token.kind + "]");
token = manager.getNextToken();
}

Parser parser = new Parser(Parser.class.getResourceAsStream("example"));
parser.start();
}

}

PARSER_END(Parser)

// WHITE SPACE
<DEFAULT, IN_STRING_KEYWORD>
SKIP :
{
" " // <-- skipping spaces
| "\t"
| "\n"
| "\r"
| "\f"
}

// TOKENS
TOKEN :
{
< KEYWORD1 : "keyword1" > : IN_STRING_KEYWORD
}

<IN_STRING_KEYWORD>
TOKEN : {<STRING : <CONCAT_STRING> | <UNQUOTED_STRING> > : DEFAULT
| <#CONCAT_STRING : <QUOTED_STRING> ("+" <QUOTED_STRING>)+ >
// <-- CONCAT_STRING never matches "+" part when input is "'smth' +", because whitespace is not ignored!?
| <#QUOTED_STRING : <SINGLEQUOTED_STRING> | <DOUBLEQUOTED_STRING> >
| <#SINGLEQUOTED_STRING : "'" (~["'"])* "'" >
| <#DOUBLEQUOTED_STRING :
"\""
(
(~["\"", "\\"]) |
("\\" ["n", "t", "\"", "\\"])
)*
"\""
>
| <#UNQUOTED_STRING : (~[" ","\t", ";", "{", "}", "/", "*", "'", "\"", "\n", "\r"] | "/" ~["/", "*"] | "*" ~["/"])+ >
}

void start() :
{}
{
(<KEYWORD1><STRING>";")+ <EOF>
}

这是一个应该被解析的示例文件:

keyword1 "foo" + ' bar';

我想匹配第一个 keyword1 的参数作为一个<STRING> token 。

当前输出:

keyword1[6]
Exception in thread "main" com.example.parser.TokenMgrError: Lexical error at line 1, column 15. Encountered: " " (32), after : "\"foo\""
at com.example.parser.ParserTokenManager.getNextToken(ParserTokenManager.java:616)
at com.example.parser.Parser.main(Parser.java:12)

我正在使用 JavaCC 5.0。

最佳答案

STRING 正在扩展到可以匹配的最长序列,如错误所示,它是 "foo"。右双引号后的空格不是私有(private) token CONCAT_STRING 定义的一部分。跳过标记不适用于其他标记的定义,因此您必须将空格直接合并到定义中,位于 + 的任一侧。

顺便说一句,我建议有一个像这样的最终标记定义:

<each-state-in-which-the-empty-string-cannot-be-recognized>
TOKEN : {
< ILLEGAL : ~[] >
}

这可以防止 TokenMgrError 被抛出并使调试更容易一些。

关于JavaCC 词法分析器未按预期工作(未忽略空格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14978444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com