我正在尝试为此源代码创建解析器:
[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>
}
问题是解析器正确识别令牌(“代码表”)......但它不识别令牌IDENT(“code_table_name”),因为它包含令牌CODE_TAB_BEGIN中已经包含的单词(即“代码”) 。解析器抱怨说“代码后跟无效字符_”......
话虽如此,我想知道为了让解析器正常工作我缺少了什么。我是新手,任何帮助都会非常感激; - )
谢谢, J3D
答案 0 :(得分:2)
你的词法分析器永远不会产生IDENT因为制作
<CODE_TAB_BEGIN: <IDENT> | "code" (" ")+ "table">
表示每个IDENT都可以是CODE_TAB_BEGIN,并且由于此产品首先出现,它会通过第一个匹配规则击败IDENT的产品。 (RTFFAQ)
用
替换该产品<CODE_TAB_BEGIN: "code" (" ")+ "table">
您将遇到ID和DESC的问题,但这会让您超过第二行输入。