2015-01-08 3 views
0

Я пытаюсь написать парсер для подмножества G-кода с использованием Javacc, но столкнулся с проблемами с регулярными выражениями. Когда я использую символы "^" и "$", чтобы соответствовать началу и концу строки, я получаю ошибки, если я их удаляю, но регулярное выражение неверно.Регулярное выражение 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, но я часто встречался с regex.

Во всяком случае -

Это очень трудно понять, что ваше регулярное выражение пытается сделать, но, насколько я понимаю, вы пытаетесь найти экземпляры

G0(Number here) 

И вы боретесь с используя $ и ^.

Возможна альтернатива - попробовать и указать, что вы ищете после «G0» в самом регулярном выражении, вместо того чтобы оставлять кучу подстановочных знаков.

и для этого случая у меня может быть решение для вас.

Решение:

Regex:

G0[0-9a-zA-Z] 

Все, что я сделал, это просто добавить скобок - которые в регулярных выражениях, указать диапазон символов, которые могут быть приняты. Таким образом, вы получаете все экземпляры «G0» с одним номером/буквой после них.

имеют хороший день :)

+0

Я хочу использовать^и $, чтобы ограничить строку одним экземпляром регулярного выражения. Решение, которое вы дали, позволяет мне ввести строку, такую ​​как «G01G02», и она будет принята. – Gavin0487

+0

Не совсем. в скобках это ограничение; Посмотрите на это: http://oi57.tinypic.com/141l05d.jpg Источник: http://www.regexr.com/ –

+0

Это скобки, а не круглые скобки. Кроме того, ОП не спрашивал, как сопоставить «G01» или «G02», он спрашивал, как убедиться, что только один из них находится на линии, чего твой не делает. –

1

JavaCC не поддерживает^и $, которые являются общими с другими инструментами рег Исх. Вместо этого он поддерживает что-то более мощное (и более сложное в использовании) лексические состояния. Вы можете (и должны) прочитать о них в документации JavaCC и часто задаваемых вопросах.

Я не знаю 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. 
Смежные вопросы