gpt4 book ai didi

JavaCC:如何处理包含常用单词的标记

转载 作者:行者123 更新时间:2023-11-30 04:39:59 27 4
gpt4 key购买 nike

我正在尝试为这样的源代码创建一个解析器:

[code table 1.0]
code table code_table_name
id = 500
desc = "my code table one"
end code table

...下面是我定义的语法:

PARSER_BEGIN(CodeTableParser)
...
PARSER_END(CodeTableParser)

/* skip spaces */
SKIP: {
" "
| "\t"
| "\r"
| "\n"
}

/* reserved words */
TOKEN [IGNORE_CASE]: {
<CODE_TAB_HEADER: "[code table 1.0]">
| <CODE_TAB_END: "end" (" ")+ <CODE_TAB_BEGIN>>
| <CODE_TAB_BEGIN: <IDENT> | "code" (" ")+ "table">
| <ID: "id">
| <DESC: "desc">
}

/* token images */
TOKEN: {
<NUMBER: (<DIGIT>)+>
| <IDENT: (<ALPHA>)+>
| <VALUE: (<ALPHA> ["[", "]"])+>
| <STRING: <QUOTED>>
}

TOKEN: {
<#ALPHA: ["A"-"Z", "a"-"z", "0"-"9", "$", "_", "."]>
| <#DIGIT: ["0"-"9"]>
| <#QUOTED: "\"" (~["\""])* "\"">
}

void parse():
{
}
{
expression() <EOF>
}

void expression():
{
Token tCodeTab;
}
{
<CODE_TAB_HEADER>
<CODE_TAB_BEGIN>
tCodeTab = <IDENT>
(
<ID>
<DESC>
)*
<CODE_TAB_END>
}

问题在于解析器正确识别 token (“代码表”)...但它无法识别 token IDENT(“code_table_name”),因为它包含 token CODE_TAB_BEGIN 中已包含的单词(即“代码”) 。解析器提示说“代码后面跟着无效字符 _”...

话虽如此,我想知道我缺少什么才能让解析器正常工作。我是新手,任何帮助将不胜感激;-)

谢谢,j3d

最佳答案

你的词法分析器永远不会产生 IDENT,因为生产

<CODE_TAB_BEGIN:      <IDENT> | "code" (" ")+ "table">

表示每个 IDENT 都可以是 CODE_TAB_BEGIN,并且由于此产生式首先出现,因此它根据第一个匹配规则击败了 IDENT 的产生式。 (RTFFAQ)

将该产生式替换为

<CODE_TAB_BEGIN:      "code" (" ")+ "table">

您将在 ID 和 DESC 方面遇到麻烦,但这可以让您跳过第二行输入。

关于JavaCC:如何处理包含常用单词的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12531935/

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