sccd_grammar.g 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. start: sccd;
  2. sccd: diagram INDENT (top)? element+ (bottom)? DEDENT;
  3. @element: (inport | class);
  4. inport: INPORT LPAR nameattr RPAR NEWLINE;
  5. nameattr: NAMEATTR ASSIGN string;
  6. defaultattr: DEFAULTATTR ASSIGN boolean;
  7. classattr: CLASSATTR ASSIGN string;
  8. class: CLASS LPAR classdefattrs RPAR
  9. ( (COLON NEWLINE INDENT classelement+ DEDENT) | NEWLINE);
  10. classdefattrs: classdefattr (COMMA classdefattr)*;
  11. classdefattr: nameattr | defaultattr;
  12. @classelement: inport | association | inheritance | aggregation | composition |
  13. attribute | constructor | destructor | method | statemachine;
  14. aggregation: AGGREGATION LPAR aggregattrs RPAR NEWLINE;
  15. aggregattrs: relattr (COMMA relattr)*;
  16. composition: COMPOSITION LPAR compattrs RPAR NEWLINE;
  17. compattrs: relattr (COMMA relattr)*;
  18. @relattr: classattr | minattr | maxattr;
  19. minattr: MIN ASSIGN integer;
  20. maxattr: MAX ASSIGN integer;
  21. association: ASSOCIATION LPAR assocattrs RPAR NEWLINE;
  22. assocattrs: assocattr (COMMA assocattr)*;
  23. assocattr: nameattr | relattr;
  24. inheritance: INHERITANCE LPAR inherattrs RPAR NEWLINE;
  25. inherattrs: inherattr (COMMA inherattr)*;
  26. inherattr: priorityattr | classattr;
  27. priorityattr: PRIORITYATTR ASSIGN integer;
  28. attribute: ATTRIBUTE LPAR attributeattrs RPAR NEWLINE;
  29. attributeattrs: attributeattr (COMMA attributeattr)*;
  30. attributeattr: nameattr | defaultvalueattr | typenameattr;
  31. defaultvalueattr: DEFAULTATTR ASSIGN string;
  32. typenameattr: TYPEATTR ASSIGN string;
  33. diagram: DIAGRAM (NEWLINE)+;
  34. DIAGRAM: 'Diagram\([^\)]*\):'
  35. {
  36. start: 'Diagram\(' attrs '\)' ':';
  37. @attr: (attrname|attrauthor|attrdescription);
  38. @attrs: attr (',' attr)*;
  39. attrname: ATTRNAME '=' string;
  40. attrauthor: ATTRAUTHOR '=' string;
  41. attrdescription: ATTRDESCRIPTION '=' string;
  42. ATTRNAME: 'name';
  43. ATTRAUTHOR: 'author';
  44. ATTRDESCRIPTION: 'description';
  45. string: (STRVALUE|LONG_STRVALUE) string? ;
  46. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')' ;
  47. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')'
  48. (%newline)
  49. ;
  50. WS: '[\t \f\n]+' (%ignore);
  51. COMMENT: '\#[^\n]*'(%ignore);
  52. };
  53. top: TOP BODY NEWLINE;
  54. bottom: BOTTOM BODY;
  55. constructor: CONSTRUCTOR body NEWLINE;
  56. destructor: DESTRUCTOR body NEWLINE;
  57. method: METHOD body NEWLINE;
  58. statemachine: STATEMACHINE (NEWLINE |
  59. (COLON NEWLINE INDENT (state | orthogonal | pseudostate | transition)+ DEDENT));
  60. @state_element: state | orthogonal | pseudostate | transition | onenter | onexit;
  61. onenter: ONENTER BODY NEWLINE;
  62. onexit: ONEXIT BODY NEWLINE;
  63. state: STATE LPAR statename RPAR (NEWLINE |
  64. (COLON NEWLINE INDENT state_element+ DEDENT));
  65. orthogonal: ORTHOGONAL LPAR statename RPAR (NEWLINE |
  66. (COLON NEWLINE INDENT state_element+ DEDENT));
  67. @pseudostate: (initial | final | history) NEWLINE;
  68. initial: INITIAL ASSIGN statename;
  69. final: FINAL ASSIGN statename;
  70. history: HISTORY ASSIGN statename;
  71. statename: string;
  72. transition: TRANSITION LPAR transitionattrs RPAR (NEWLINE |
  73. (COLON NEWLINE INDENT event? guard? raise* actions? DEDENT));
  74. transitionattrs: transitionattr (COMMA transitionattr)*;
  75. transitionattr: (portattr | targetattr | afterattr);
  76. portattr: PORTATTR ASSIGN string;
  77. targetattr: TARGETATTR ASSIGN string;
  78. afterattr: AFTERATTR ASSIGN float;
  79. event: EVENT NEWLINE;
  80. EVENT: 'event\ =\ [^\(]+\([^\)]*\)'
  81. {
  82. start: EVENT ASSIGN namevalue LPAR formalparameters? RPAR;
  83. formalparameters: formalparameter (COMMA formalparameter)*;
  84. formalparameter: namevalue COLON nav_expr (ASSIGN defaultvalue)?;
  85. namevalue: name;
  86. nav_expr: self? | (self DOT)? dotexpression;
  87. self: SELF;
  88. dotexpression: dotted_name;
  89. defaultvalue: atomvalue;
  90. atomvalue: integervalue | floatvalue | booleanvalue | stringvalue;
  91. integervalue: integer;
  92. floatvalue: float;
  93. booleanvalue: boolean;
  94. stringvalue: string;
  95. dotted_name: name (DOT name)*;
  96. name: NAME;
  97. NAME: '[a-zA-Z_][a-zA-Z_0-9\-]*(?!r?"|r?\')'
  98. (%unless
  99. EVENT: 'event';
  100. TRUE: 'True';
  101. FALSE: 'False';
  102. SELF: 'self';
  103. );
  104. boolean: TRUE | FALSE;
  105. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  106. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  107. integer: DEC_NUMBER;
  108. float: FLOAT_NUMBER;
  109. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')' ;
  110. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')'
  111. (%newline)
  112. ;
  113. string: (STRVALUE|LONG_STRVALUE) string?;
  114. ASSIGN: '=';
  115. DOT: '\.';
  116. COLON: ':';
  117. LPAR: '\(';
  118. RPAR: '\)';
  119. COMMA: ',';
  120. WS: '[\t \f\n]+' (%ignore);
  121. COMMENT: '\#[^\n]*'(%ignore);
  122. };
  123. guard: GUARD NEWLINE;
  124. GUARD: 'guard\ =\ \{[^\}]*\}'
  125. {
  126. start: GUARD ASSIGN LBR expression RBR;
  127. funccall_expr: (expression '->')? functionname LPAR arguments? RPAR;
  128. functionname: name;
  129. nav_expr: self? | (self DOT)? dotexpression;
  130. self: SELF;
  131. dotexpression: dotted_name;
  132. arguments: argument (COMMA argument)*;
  133. argument: (argumentname ASSIGN)? expression;
  134. argumentname: name;
  135. expression: nav_expr | atomvalue | tuple | vector | dict |
  136. unopexpr | binopexpr | funccall_expr | selection;
  137. atomvalue: integervalue | floatvalue | booleanvalue | stringvalue;
  138. integervalue: integer;
  139. floatvalue: float;
  140. booleanvalue: boolean;
  141. stringvalue: string;
  142. @unopexpr: parexpr | notexpr | minusexpr;
  143. parexpr: LPAR expression RPAR;
  144. notexpr: NOT expression;
  145. minusexpr: MINUS expression;
  146. @binopexpr: selection | andexpr | orexpr | lthanexpr | leqthanexpr |
  147. gthanexpr | geqthanexpr | equalsexpr | nequalsexpr |
  148. multexpr | divexpr | modexpr | subtractionexpr | sumexpr;
  149. dict: LSQBR NEWLINE? dictitems NEWLINE? RSQBR;
  150. dictitems: dictitem (COMMA NEWLINE? dictitem)*;
  151. dictitem: expression COLON expression;
  152. vector: LSQBR NEWLINE? (vectoritems NEWLINE?)? RSQBR;
  153. vectoritems: vectoritem (COMMA NEWLINE? vectoritem)*;
  154. vectoritem: expression;
  155. tuple: LPAR tuplearg (COMMA tuplearg)+ RPAR;
  156. tuplearg: expression;
  157. selection: expression LSQBR expression RSQBR;
  158. andexpr: expression LAND expression;
  159. orexpr: expression LOR expression;
  160. lthanexpr: expression LTHAN expression;
  161. leqthanexpr: expression LEQTHAN expression;
  162. gthanexpr: expression GTHAN expression;
  163. geqthanexpr: expression GEQTHAN expression;
  164. equalsexpr: expression EQUALS expression;
  165. nequalsexpr: expression NEQUALS expression;
  166. subtractionexpr: expression MINUS expression;
  167. sumexpr: expression PLUS expression;
  168. multexpr: expression MULT expression;
  169. divexpr: expression DIV expression;
  170. modexpr: expression MOD expression;
  171. dotted_name: name (DOT name)*;
  172. name: NAME;
  173. NAME: '[a-zA-Z_][a-zA-Z_0-9]*(?!r?"|r?\')'
  174. (%unless
  175. NOT: 'not';
  176. TRUE: 'True';
  177. FALSE: 'False';
  178. LAND: 'and';
  179. LOR: 'or';
  180. GUARD: 'guard';
  181. SELF: 'self';
  182. );
  183. boolean: TRUE | FALSE;
  184. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  185. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  186. integer: DEC_NUMBER;
  187. float: FLOAT_NUMBER;
  188. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')' ;
  189. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')'
  190. (%newline)
  191. ;
  192. string: (STRVALUE|LONG_STRVALUE) string?;
  193. MULT: '\*';
  194. DIV: '/';
  195. POTENCY: '@\d';
  196. LTHAN: '<';
  197. LEQTHAN: '<=';
  198. GTHAN: '>';
  199. GEQTHAN: '>=';
  200. ASSIGN: '=';
  201. DOT: '\.';
  202. COLON: ':';
  203. LPAR: '\(';
  204. RPAR: '\)';
  205. COMMA: ',';
  206. EQUALS: '==';
  207. NEQUALS: '!=';
  208. PLUS: '\+';
  209. MINUS: '-';
  210. MOD: '%';
  211. LSQBR: '\[';
  212. RSQBR: '\]';
  213. LBR: '\{';
  214. RBR: '\}';
  215. NEWLINE: '(\r?\n[\t ]*)+'
  216. (%newline)
  217. ;
  218. WS: '[\t \f]+' (%ignore);
  219. COMMENT: '\#[^\n]*'(%ignore);
  220. };
  221. raise: RAISE NEWLINE;
  222. RAISE: 'raise\ \+=\ \{[^\}]*\}'
  223. {
  224. start: RAISE PLUS ASSIGN LBR scopeattr? targetattr? funccall_expr RBR;
  225. scopeattr: SCOPE ASSIGN expression COMMA;
  226. targetattr: TARGET ASSIGN expression COMMA;
  227. funccall_expr: functionname LPAR arguments? RPAR;
  228. functionname: name;
  229. nav_expr: self? | (self DOT)? dotexpression;
  230. self: SELF;
  231. dotexpression: dotted_name;
  232. arguments: argument (COMMA argument)*;
  233. argument: (argumentname ASSIGN)? expression;
  234. argumentname: name;
  235. expression: nav_expr | atomvalue | tuple | vector | dict |
  236. unopexpr | binopexpr | funccall_expr | selection;
  237. atomvalue: integervalue | floatvalue | booleanvalue | stringvalue;
  238. integervalue: integer;
  239. floatvalue: float;
  240. booleanvalue: boolean;
  241. stringvalue: string;
  242. @unopexpr: parexpr | notexpr | minusexpr;
  243. parexpr: LPAR expression RPAR;
  244. notexpr: NOT expression;
  245. minusexpr: MINUS expression;
  246. @binopexpr: selection | andexpr | orexpr | lthanexpr | leqthanexpr |
  247. gthanexpr | geqthanexpr | equalsexpr | nequalsexpr |
  248. multexpr | divexpr | modexpr | subtractionexpr | sumexpr;
  249. dict: LSQBR NEWLINE? dictitems NEWLINE? RSQBR;
  250. dictitems: dictitem (COMMA NEWLINE? dictitem)*;
  251. dictitem: expression COLON expression;
  252. vector: LSQBR NEWLINE? (vectoritems NEWLINE?)? RSQBR;
  253. vectoritems: vectoritem (COMMA NEWLINE? vectoritem)*;
  254. vectoritem: expression;
  255. tuple: LPAR tuplearg (COMMA tuplearg)+ RPAR;
  256. tuplearg: expression;
  257. selection: expression LSQBR expression RSQBR;
  258. andexpr: expression LAND expression;
  259. orexpr: expression LOR expression;
  260. lthanexpr: expression LTHAN expression;
  261. leqthanexpr: expression LEQTHAN expression;
  262. gthanexpr: expression GTHAN expression;
  263. geqthanexpr: expression GEQTHAN expression;
  264. equalsexpr: expression EQUALS expression;
  265. nequalsexpr: expression NEQUALS expression;
  266. subtractionexpr: expression MINUS expression;
  267. sumexpr: expression PLUS expression;
  268. multexpr: expression MULT expression;
  269. divexpr: expression DIV expression;
  270. modexpr: expression MOD expression;
  271. dotted_name: name (DOT name)*;
  272. name: NAME;
  273. NAME: '[a-zA-Z_][a-zA-Z_0-9]*(?!r?"|r?\')'
  274. (%unless
  275. NOT: 'not';
  276. TRUE: 'True';
  277. FALSE: 'False';
  278. LAND: 'and';
  279. LOR: 'or';
  280. RAISE: 'raise';
  281. SCOPE: 'scope';
  282. TARGET: 'target';
  283. SELF: 'self';
  284. );
  285. boolean: TRUE | FALSE;
  286. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  287. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  288. integer: DEC_NUMBER;
  289. float: FLOAT_NUMBER;
  290. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')' ;
  291. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')'
  292. (%newline)
  293. ;
  294. string: (STRVALUE|LONG_STRVALUE) string?;
  295. MULT: '\*';
  296. DIV: '/';
  297. POTENCY: '@\d';
  298. LTHAN: '<';
  299. LEQTHAN: '<=';
  300. GTHAN: '>';
  301. GEQTHAN: '>=';
  302. ASSIGN: '=';
  303. DOT: '\.';
  304. COLON: ':';
  305. LPAR: '\(';
  306. RPAR: '\)';
  307. COMMA: ',';
  308. EQUALS: '==';
  309. NEQUALS: '!=';
  310. PLUS: '\+';
  311. MINUS: '-';
  312. MOD: '%';
  313. LSQBR: '\[';
  314. RSQBR: '\]';
  315. LBR: '\{';
  316. RBR: '\}';
  317. NEWLINE: '(\r?\n[\t ]*)+'
  318. (%newline)
  319. ;
  320. WS: '[\t \f]+' (%ignore);
  321. COMMENT: '\#[^\n]*'(%ignore);
  322. };
  323. actions: ACTIONS body NEWLINE;
  324. CONSTRUCTOR: 'Constructor(\([^\)]*\))?'
  325. {
  326. start: CONSTRUCTOR (LPAR formalparameters RPAR)?;
  327. formalparameters: formalparameter (COMMA formalparameter)*;
  328. formalparameter: namevalue (COLON nav_expr)?(ASSIGN defaultvalue)?;
  329. namevalue: name;
  330. nav_expr: self? | (self DOT)? dotexpression;
  331. self: SELF;
  332. dotexpression: dotted_name;
  333. defaultvalue: atomvalue;
  334. atomvalue: integervalue | floatvalue | booleanvalue | stringvalue;
  335. integervalue: integer;
  336. floatvalue: float;
  337. booleanvalue: boolean;
  338. stringvalue: string;
  339. dotted_name: name (DOT name)*;
  340. name: NAME;
  341. NAME: '[a-zA-Z_][a-zA-Z_0-9]*(?!r?"|r?\')'
  342. (%unless
  343. TRUE: 'True';
  344. FALSE: 'False';
  345. CONSTRUCTOR: 'Constructor';
  346. SELF: 'self';
  347. );
  348. boolean: TRUE | FALSE;
  349. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  350. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  351. integer: DEC_NUMBER;
  352. float: FLOAT_NUMBER;
  353. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')' ;
  354. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')'
  355. (%newline)
  356. ;
  357. string: (STRVALUE|LONG_STRVALUE) string?;
  358. ASSIGN: '=';
  359. DOT: '\.';
  360. COLON: ':';
  361. LPAR: '\(';
  362. RPAR: '\)';
  363. COMMA: ',';
  364. WS: '[\t \f\n]+' (%ignore);
  365. COMMENT: '\#[^\n]*'(%ignore);
  366. };
  367. METHOD: 'Method [^\(]*\([^\)]*\)'
  368. {
  369. start: METHOD methodname LPAR formalparameters? RPAR;
  370. methodname: name;
  371. formalparameters: formalparameter (COMMA formalparameter)*;
  372. formalparameter: namevalue (COLON nav_expr)?(ASSIGN defaultvalue)?;
  373. namevalue: name;
  374. nav_expr: self? | (self DOT)? dotexpression;
  375. self: SELF;
  376. dotexpression: dotted_name;
  377. defaultvalue: atomvalue;
  378. atomvalue: integervalue | floatvalue | booleanvalue | stringvalue;
  379. integervalue: integer;
  380. floatvalue: float;
  381. booleanvalue: boolean;
  382. stringvalue: string;
  383. dotted_name: name (DOT name)*;
  384. name: NAME;
  385. NAME: '[a-zA-Z_][a-zA-Z_0-9]*(?!r?"|r?\')'
  386. (%unless
  387. TRUE: 'True';
  388. FALSE: 'False';
  389. METHOD: 'Method';
  390. SELF: 'self';
  391. );
  392. boolean: TRUE | FALSE;
  393. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  394. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  395. integer: DEC_NUMBER;
  396. float: FLOAT_NUMBER;
  397. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')' ;
  398. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')'
  399. (%newline)
  400. ;
  401. string: (STRVALUE|LONG_STRVALUE) string?;
  402. ASSIGN: '=';
  403. DOT: '\.';
  404. COLON: ':';
  405. LPAR: '\(';
  406. RPAR: '\)';
  407. COMMA: ',';
  408. WS: '[\t \f\n]+' (%ignore);
  409. COMMENT: '\#[^\n]*'(%ignore);
  410. };
  411. body: BODY;
  412. BODY: '\{[^\}]*\}'
  413. {
  414. start: LBR NEWLINE? statement* RBR;
  415. @statement: import | funccall_stm | decl_stm |
  416. assignment | plusassign | minusassign | while_stm
  417. | ifelse_stm | break_stm | continue_stm | return_stm;
  418. decl_stm: nav_expr decl_name (ASSIGN expression)? NEWLINE;
  419. decl_name: name;
  420. return_stm: RETURN (expression)? NEWLINE;
  421. ifelse_stm: IF expression COLON NEWLINE
  422. statementbody
  423. (ELSE COLON NEWLINE
  424. statementbody
  425. )? END NEWLINE
  426. ;
  427. while_stm: WHILE expression COLON NEWLINE statementbody END NEWLINE;
  428. statementbody: statement+;
  429. break_stm: BREAK NEWLINE;
  430. continue_stm: CONTINUE NEWLINE;
  431. import: (FROM fromname)? IMPORT importname (AS asname)? NEWLINE;
  432. fromname: dotted_name;
  433. importname: dotted_name;
  434. asname: name;
  435. funccall_stm: (expression '->')? functionname LPAR arguments? RPAR NEWLINE;
  436. funccall_expr: (expression '->')? functionname LPAR arguments? RPAR;
  437. nav_expr: self? | (self DOT)? dotexpression;
  438. self: SELF;
  439. dotexpression: dotted_name;
  440. functionname: name;
  441. arguments: argument (COMMA argument)*;
  442. argument: (argumentname ASSIGN)? expression;
  443. argumentname: name;
  444. assignment: expression ASSIGN expression NEWLINE;
  445. plusassign: expression PLUSASSIGN expression NEWLINE;
  446. minusassign: expression MINUSASSIGN expression NEWLINE;
  447. expression: nav_expr | atomvalue | tuple | vector | dict |
  448. unopexpr | binopexpr | funccall_expr | selection;
  449. atomvalue: integervalue | floatvalue | booleanvalue | stringvalue;
  450. integervalue: integer;
  451. floatvalue: float;
  452. booleanvalue: boolean;
  453. stringvalue: string;
  454. @unopexpr: parexpr | notexpr | minusexpr;
  455. parexpr: LPAR expression RPAR;
  456. notexpr: NOT expression;
  457. minusexpr: MINUS expression;
  458. @binopexpr: selection | andexpr | orexpr | lthanexpr | leqthanexpr |
  459. gthanexpr | geqthanexpr | equalsexpr | nequalsexpr |
  460. multexpr | divexpr | modexpr | subtractionexpr | sumexpr;
  461. dict: LSQBR NEWLINE? dictitems NEWLINE? RSQBR;
  462. dictitems: dictitem (COMMA NEWLINE? dictitem)*;
  463. dictitem: expression COLON expression;
  464. vector: LSQBR NEWLINE? (vectoritems NEWLINE?)? RSQBR;
  465. vectoritems: vectoritem (COMMA NEWLINE? vectoritem)*;
  466. vectoritem: expression;
  467. tuple: LPAR tuplearg (COMMA tuplearg)+ RPAR;
  468. tuplearg: expression;
  469. selection: expression LSQBR expression RSQBR;
  470. andexpr: expression LAND expression;
  471. orexpr: expression LOR expression;
  472. lthanexpr: expression LTHAN expression;
  473. leqthanexpr: expression LEQTHAN expression;
  474. gthanexpr: expression GTHAN expression;
  475. geqthanexpr: expression GEQTHAN expression;
  476. equalsexpr: expression EQUALS expression;
  477. nequalsexpr: expression NEQUALS expression;
  478. subtractionexpr: expression MINUS expression;
  479. sumexpr: expression PLUS expression;
  480. multexpr: expression MULT expression;
  481. divexpr: expression DIV expression;
  482. modexpr: expression MOD expression;
  483. dotted_name: name (DOT name)*;
  484. name: NAME;
  485. NAME: '[a-zA-Z_][a-zA-Z_0-9]*(?!r?"|r?\')'
  486. (%unless
  487. IMPORT: 'import';
  488. AS: 'as';
  489. FROM: 'from';
  490. NOT: 'not';
  491. TRUE: 'True';
  492. FALSE: 'False';
  493. LAND: 'and';
  494. LOR: 'or';
  495. IF: 'if';
  496. ELSE: 'else';
  497. WHILE: 'while';
  498. BREAK: 'break';
  499. CONTINUE: 'continue';
  500. RETURN: 'return';
  501. END: 'end';
  502. SELF: 'self';
  503. );
  504. boolean: TRUE | FALSE;
  505. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  506. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  507. integer: DEC_NUMBER;
  508. float: FLOAT_NUMBER;
  509. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')' ;
  510. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')'
  511. (%newline)
  512. ;
  513. string: (STRVALUE|LONG_STRVALUE) string?;
  514. MULT: '\*';
  515. DIV: '/';
  516. POTENCY: '@\d';
  517. LTHAN: '<';
  518. LEQTHAN: '<=';
  519. GTHAN: '>';
  520. GEQTHAN: '>=';
  521. ASSIGN: '=';
  522. PLUSASSIGN: '\+=';
  523. MINUSASSIGN: '\-=';
  524. DOT: '\.';
  525. COLON: ':';
  526. LPAR: '\(';
  527. RPAR: '\)';
  528. COMMA: ',';
  529. EQUALS: '==';
  530. NEQUALS: '!=';
  531. PLUS: '\+';
  532. MINUS: '-';
  533. MOD: '%';
  534. LSQBR: '\[';
  535. RSQBR: '\]';
  536. LBR: '\{';
  537. RBR: '\}';
  538. NEWLINE: '(\r?\n[\t ]*)+'
  539. (%newline)
  540. ;
  541. WS: '[\t \f]+' (%ignore);
  542. COMMENT: '\#[^\n]*'(%ignore);
  543. INDENT: '<INDENT>';
  544. DEDENT: '<DEDENT>';
  545. };
  546. // specific tokens
  547. CLASS: 'Class';
  548. TOP: 'Top';
  549. BOTTOM: 'Bottom';
  550. INPORT: 'Inport';
  551. NAMEATTR: 'name';
  552. DEFAULTATTR: 'default';
  553. TYPEATTR: 'type';
  554. CLASSATTR: 'class';
  555. PRIORITYATTR: 'priority';
  556. ASSOCIATION: 'Association';
  557. INHERITANCE: 'Inheritance';
  558. COMPOSITION: 'Composition';
  559. AGGREGATION: 'Aggregation';
  560. ATTRIBUTE: 'Attribute';
  561. MIN: 'min';
  562. MAX: 'max';
  563. DESTRUCTOR: 'Destructor';
  564. STATEMACHINE: 'StateMachine';
  565. STATE: 'State';
  566. INITIAL: 'initial';
  567. FINAL: 'final';
  568. HISTORY: 'history';
  569. ORTHOGONAL: 'Orthogonal';
  570. TRANSITION: 'Transition';
  571. TARGETATTR: 'target';
  572. PORTATTR: 'port';
  573. AFTERATTR: 'after';
  574. ACTIONS: 'Actions';
  575. ONENTER: 'OnEnter';
  576. ONEXIT: 'OnExit';
  577. // general tokens
  578. TRUE: 'True';
  579. FALSE: 'False';
  580. boolean: TRUE | FALSE;
  581. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  582. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  583. integer: DEC_NUMBER;
  584. float: FLOAT_NUMBER;
  585. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')' ;
  586. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')'
  587. (%newline)
  588. ;
  589. string: (STRVALUE|LONG_STRVALUE) string?;
  590. MULT: '\*';
  591. DIV: '/';
  592. POTENCY: '@\d';
  593. LTHAN: '<';
  594. LEQTHAN: '<=';
  595. GTHAN: '>';
  596. GEQTHAN: '>=';
  597. ASSIGN: '=';
  598. DOT: '\.';
  599. COLON: ':';
  600. LPAR: '\(';
  601. RPAR: '\)';
  602. COMMA: ',';
  603. EQUALS: '==';
  604. PLUS: '\+';
  605. MINUS: '-';
  606. MOD: '%';
  607. LSQBR: '\[';
  608. RSQBR: '\]';
  609. NEWLINE: '(\r?\n[\t ]*)+' // Don't count on the + to prevent multiple NEWLINE tokens. It's just an optimization
  610. (%newline)
  611. ;
  612. // ignores
  613. WS: '[\t \f]+' (%ignore);
  614. LINE_CONT: '\\[\t \f]*\r?\n' (%ignore) (%newline);
  615. COMMENT: '\#[^\n]*'(%ignore);
  616. // identation
  617. INDENT: '<INDENT>';
  618. DEDENT: '<DEDENT>';
  619. EOF: '<EOF>';
  620. ###
  621. from plyplus.grammars.python_indent_postlex import PythonIndentTracker
  622. self.lexer_postproc = PythonIndentTracker