我正在尝试使用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");})+
}
我需要使用什么正则表达式才能使其正常工作?
提前致谢
答案 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;的所有实例。后面有一个数字/字母。
度过愉快的一天:)