2015-01-08 75 views
0

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

例如,我希望词法分析器接受字符串"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");})+ 
} 

我需要什么样的正则表达式才能使它工作?

在此先感谢

+0

试过,然后我得到以下错误:org.javacc.parser.ParseException:遇到 “ ”(“ ”(“ ”\“ ”“ 在第36行,列31 – Gavin0487

+0

因此,每个令牌” G01 “或”G02“必须单独在一行上,之前或之后没有空格?或者你想在“G”之前和“1”或“2”之后允许空格吗? –

回答

0

我没有足够的信誉发表评论,所以我会写下来作为一个可能的解决方案。

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

总之 -

这真的很难理解你的正则表达式是试图做的,但据我了解,你正在努力寻找的

G0(Number here) 

实例,你与挣扎使用$和^。

可能的替代方法是尝试指定在正则表达式本身中的“G0”之后寻找什么,而不是留下一堆通配符。

对于这种情况下,我可能有一个解决方案给你。

解决方案

正则表达式:

G0[0-9a-zA-Z] 

一切,我所做的只是添加parenthesises - 这在正则表达式,指定可以被接受的一个范围内的字符。这样,你就可以用一个数字/字母来接收所有的“G0”实例。

有一个愉快的一天:)

+0

我想使用^和$将字符串限制为正则表达式的一个实例。您提供的解决方案允许我输入一个字符串,例如“G01G02”,它将被接受。 – Gavin0487

+0

不是。括号限制了这一点;看看这个:http://oi57.tinypic.com/141l05d.jpg 来源:http://www.regexr.com/ –

+0

他们是括号,而不是括号。此外,OP并没有要求如何匹配'G01'或'G02',而是在询问如何确保只有一个线路在线,而这些线路并不属于你。 –

1

的JavaCC不支持^和$是与其他REG防爆工具常见。相反,它支持更强大(更难使用)的词汇状态。你可以(也应该)在JavaCC文档和FAQ中阅读它们。

我不知道G代码,我也不能快速找到标准,但从快速浏览示例和教程我会做出一些假设。

  • 每一行都是空的,一个语句或一个百分号或它自己的注释。
  • 每个语句都是一系列语句标记。
  • 声明令牌是代码,轴,数字。
  • 空格和制表符允许在除了不是注释的标记内部的任何地方。
  • 一个在开始或结束或两个(与之前或之后可能的语句或制表符,每行注释

方法:我把换行和注释非跳过标记,并在与他们打交道。语法水平。这意味着你实际上并不需要使用词法状态

词汇部分:

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.