Javacc正则表达式

时间:2015-01-08 11:40:16

标签: regex javacc

我正在尝试使用Javacc为G-Code的子集编写解析器,但是遇到了正则表达式的问题。当我使用符号"^""$"来匹配字符串的开头和结尾时,我会收到错误,如果我删除它们会运行但正则表达式不正确。

例如,我希望词法分析器接受字符串"G01""G02",但如果没有^$则允许"G01G02"

options {
    STATIC = true;
}

PARSER_BEGIN(Parser)
    class Parser {
        public static void main(String[] args) {
            Parser lexan = new Parser(System.in);
            try {
                lexan.start();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            System.out.println("Finished Lexical Analysis");
        } // END main
    } // END class
PARSER_END(Parser)

// TOKENS
// Ignore all whitespace
SKIP:{" " | "\t" | "\n" | "\r"}

// Declare tokens 
TOKEN:{<G0X: ^"G0"["1", "2"]$>}

void start():
{}
{
    (<G0X> {System.out.println("\G0X\n");})+
}

我需要使用什么正则表达式才能使其正常工作?

提前致谢

2 个答案:

答案 0 :(得分:2)

JavaCC不支持与其他reg ex工具相同的^和$。相反,它支持更强大(更难使用)词汇状态的东西。您可以(并且应该)在JavaCC文档和FAQ中阅读它们。

我不知道G-Code,也不能快速找到标准,但是通过快速查看示例和教程我会做出一些假设。

  • 每一行都是空的,一个声明,或一个百分号,或一个评论。
  • 每个语句都是一系列语句令牌。
  • 声明令牌是代码,轴,数字。
  • 除了不是注释的令牌内外,允许使用空格和制表符。
  • 开头或结尾每行一条评论或两条评论(可能的陈述或标签在之前或之后。

方法:我将换行和注释视为非跳过的标记,并在语法层面处理它们。这意味着您实际上不需要使用词汇状态。

词汇部分:

SKIP:{" " | "\t" }

TOKEN: {
    <NEWLINE: "\n" | "\r" | "\n\r" >
|   <PERCENT: "%">
|   <COMMENT: "(" [^")"]* ")"
|   <G0X: ^"G0"["1", "2"]$>
|   <AXIS: "X" | "Y" | "Z">
|   <NUMBER: ... >
}

语法部分:这里我将使用非正式表示法,因为JavaCC相当嘈杂

Program --> PERCENT NEWLINE (Line)* PERCENT NEWLINE
Line --> COMMENT (Statement)? NEWLINE | Statement (COMMENT)? NEWLINE | NEWLINE
Statement --> G0X (AXIS NUMBER)*  // I'm really just guessing here.

答案 1 :(得分:0)

我没有足够的声誉来发表评论,因此我会将其作为可能的解决方案写下来。

我几乎没有尝试过JavaCC,但我确实搞乱了正则表达式。

无论如何 -

很难理解你的正则表达式试图做什么,但据我所知,你正试图找到

的实例
G0(Number here)

你正在努力使用$和^。

可能的替代方案是尝试在&#34; G0&#34;之后指定您要寻找的内容。在正则表达式本身而不是留下一堆通配符。

对于那种情况,我可能会为您提供解决方案。

<强>解决方案

正则表达式:

G0[0-9a-zA-Z]

我所做的只是添加括号 - 在正则表达式中,指定可能被接受的字符范围。通过这种方式,您可以收到&#34; G0&#34;的所有实例。后面有一个数字/字母。

度过愉快的一天:)