Как разобрать Integer / Identifier / String / Operator с C ++ 11 регулярное выражение? - PullRequest
0 голосов
/ 15 октября 2019

У меня очень простая грамматика языка сценариев:

compilationUnit : ( variable | print )* EOF;
variable : LET ID EQUALS value;
print : PRINT ( ID ) ;
value : INTEGER
      | STRING ;

// tokens
LET : 'let' ;
PRINT : 'print' ;
EQUALS : '=' ;
INTEGER : [0-9]+ ;
STRING : '"'.*'"' ;
ID : [a-zA-Z0-9]+ ;
OPERATOR : ==|!=|<|<=|>|>=|+|-|*|/|% ;
WS: [ \t\n\r]+ -> skip ;

Например, у меня есть текст:

let x = 10;
let y = 5;
let z = x + y;
print(z);
print(x == y);

Как проанализировать целое число / идентификатор / строку / оператор с C ++11 регулярных выражений?

Мой шаблон регулярных выражений кажется неправильным: "([0-9]+)|[A-Z_a-z][A-Z_a-z0-9]*|=|==|!=|<|<=|>|>="

1 Ответ

0 голосов
/ 15 октября 2019

Я не знаком с C ++ 11, но вижу несколько возможных проблем с вашим шаблоном:

1) Ваши парены обертывают только первый токен из набора ORed - переместите близко кконец рисунка или удалите их целиком. Если вы ищете настоящие символы в скобках, избегайте их там, где они есть. (Обычно с предыдущей обратной косой чертой \)

2) Проверьте правила вашего компилятора по обработке reg-ex. Если C ++ 11 поддерживает «жадное» сопоставление, используйте его - оно всегда будет соответствовать наибольшему совпадению. С другой стороны, если ваш процессор использует упорядочение слева направо, измените ваш шаблон, чтобы поместить многосимвольные операторы ДО односимвольных операторов (== before =, ...), в противном случае более короткий токен совпадет с остальными.

3)! имеет особое значение в шаблоне reg-ex, избегайте его;<и> может также потребоваться экранирование.

4) Ваша строка токенов ORed должна быть заключена в квадратные скобки

Я бы попробовал:

   [[0-9]+|[A-Z_a-z][A-Z_a-z0-9]*|==|\!=|\<=|\>=|=|\<|\>]

ИЛИ (если нужна обратная ссылка)

   ([[0-9]+|[A-Z_a-z][A-Z_a-z0-9]*|==|\!=|\<=|\>=|=|\<|\>])

ИЛИ (если вы ищете настоящих паренов в удостоверении личности)

   [\([0-9]+\)|[A-Z_a-z][A-Z_a-z0-9]*|==|\!=|\<=|\>=|=|\<|\>]

Предупреждение: Покупатель остерегается - Я знаюC, C ++ и C #, но не знаю деталей стандарта C ++ 11. Я могу быть совершенно не прав. :-)

...