Javacc исключая токены - PullRequest
       8

Javacc исключая токены

0 голосов
/ 01 ноября 2018

У меня есть следующий фрагмент кода, и я хотел бы исключить зарезервированные слова в качестве идентификаторов в | (<# DIGIT>) () *>. Я понимаю, что могу сопоставить один или несколько, ноль или несколько, но как я могу исключить что-либо из регулярного выражения. Любое руководство будет с благодарностью.

TOKEN : /* Numbers and identifiers */
{
< INT : (<DIGIT>)+ >
| < #DIGIT : ["0" - "9"] >
| < ID : (<LETTER>)+("_")*(<#DIGIT>)*(<LETTER>)* >
| < #LETTER : ["a" - "z", "A" - "Z"] >
}


TOKEN : { /* RESERVED WORDS  */ 
 <VARIABLE: "variable">
|  <CONSTANT: "constant">
|  <RETURN: "return">
|  <INTEGER: "integer">
|  <BOOLEAN: "boolean">
|  <VOID: "void">
|  <MAIN: "main">
|  <IF: "if">
|  <ELSE : "else">
|  <TRUE: "true">
|  <FALSE: "false">
|  <WHILE: "while">
|  <BEGIN: "begin">
|  <END: "end">
|  <IS: "is">
|  <SKIP: "skip">
}

1 Ответ

0 голосов
/ 02 ноября 2018

Когда два регулярных выражения совпадают с самым длинным соответствием, побеждает первое. (См. FAQ по JavaCC .)

Таким образом, решение легко: изменить порядок производства:

TOKEN : { /* RESERVED WORDS  */ 
   <VARIABLE: "variable">
|  <CONSTANT: "constant">
|  <RETURN: "return">
|  <INTEGER: "integer">
|   ...
}

TOKEN : /* Numbers and identifiers */
{
  < INT : (<DIGIT>)+ >
| < #DIGIT : ["0" - "9"] >
| < ID : (<LETTER>)+("_")*(<#DIGIT>)*(<LETTER>)* >
| < #LETTER : ["a" - "z", "A" - "Z"] >
}
...