【问题标题】:JavaCC: How to handle tokens that contain common wordsJavaCC:如何处理包含常用词的标记
【发布时间】:2012-09-21 13:53:04
【问题描述】:

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

[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

【问题讨论】:

    标签: java parser-generator javacc


    【解决方案1】:

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

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

    说每个 IDENT 都可以是一个 CODE_TAB_BEGIN,并且由于这个产生式首先出现,它通过第一个匹配规则击败了 IDENT 的产生式。 (RTFFAQ)

    将生产替换为

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

    你会在 ID 和 DESC 方面遇到麻烦,但这会让你通过第二行输入。

    【讨论】:

    • 我刚刚切换到 ANTLR... 我能够让它运行。还是要发送。
    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2015-11-03
    • 2020-03-04
    相关资源
    最近更新 更多