@@ -4,41 +4,18 @@ import type { GrammarToken, LanguageProto } from '../types';
44
55export default {
66 id : 'c' ,
7- require : clike ,
7+ base : clike ,
88 optional : 'opencl-extensions' ,
9- grammar ( { extend, getOptionalLanguage } ) {
10- const c = extend ( 'clike' , {
11- 'comment' : {
12- pattern : / \/ \/ (?: [ ^ \r \n \\ ] | \\ (?: \r \n ? | \n | (? ! [ \r \n ] ) ) ) * | \/ \* [ \s \S ] * ?(?: \* \/ | $ ) / ,
13- greedy : true ,
14- } ,
15- 'string' : {
16- // https://en.cppreference.com/w/c/language/string_literal
17- pattern : / " (?: \\ (?: \r \n | [ \s \S ] ) | [ ^ " \\ \r \n ] ) * " / ,
18- greedy : true ,
19- } ,
20- 'class-name' : {
21- pattern :
22- / ( \b (?: e n u m | s t r u c t ) \s + (?: _ _ a t t r i b u t e _ _ \s * \( \( [ \s \S ] * ?\) \) \s * ) ? ) \w + | \b [ a - z ] \w * _ t \b / ,
23- lookbehind : true ,
24- } ,
25- 'keyword' :
26- / \b (?: _ A l i g n a s | _ A l i g n o f | _ A t o m i c | _ B o o l | _ C o m p l e x | _ G e n e r i c | _ I m a g i n a r y | _ N o r e t u r n | _ S t a t i c _ a s s e r t | _ T h r e a d _ l o c a l | _ _ a t t r i b u t e _ _ | a s m | a u t o | b r e a k | c a s e | c h a r | c o n s t | c o n t i n u e | d e f a u l t | d o | d o u b l e | e l s e | e n u m | e x t e r n | f l o a t | f o r | g o t o | i f | i n l i n e | i n t | l o n g | r e g i s t e r | r e t u r n | s h o r t | s i g n e d | s i z e o f | s t a t i c | s t r u c t | s w i t c h | t y p e d e f | t y p e o f | u n i o n | u n s i g n e d | v o i d | v o l a t i l e | w h i l e ) \b / ,
27- 'function' : / \b [ a - z _ ] \w * (? = \s * \( ) / i,
28- 'number' :
29- / (?: \b 0 x (?: [ \d a - f ] + (?: \. [ \d a - f ] * ) ? | \. [ \d a - f ] + ) (?: p [ + - ] ? \d + ) ? | (?: \b \d + (?: \. \d * ) ? | \B \. \d + ) (?: e [ + - ] ? \d + ) ? ) [ f u l ] { 0 , 4 } / i,
30- 'operator' : / > > = ? | < < = ? | - > | ( [ - + & | : ] ) \1| [ ? : ~ ] | [ - + * / % & | ^ ! = < > ] = ? / ,
31- } ) ;
32-
33- insertBefore ( c , 'string' , {
9+ grammar ( { base, getOptionalLanguage } ) {
10+ insertBefore ( base , 'string' , {
3411 'char' : {
3512 // https://en.cppreference.com/w/c/language/character_constant
3613 pattern : / ' (?: \\ (?: \r \n | [ \s \S ] ) | [ ^ ' \\ \r \n ] ) { 0 , 32 } ' / ,
3714 greedy : true ,
3815 } ,
3916 } ) ;
4017
41- insertBefore ( c , 'string' , {
18+ insertBefore ( base , 'string' , {
4219 'macro' : {
4320 // allow for multiline macro definitions
4421 // spaces after the # character compile fine with gcc
@@ -54,10 +31,10 @@ export default {
5431 pattern : / ^ ( # \s * i n c l u d e \s * ) < [ ^ > ] + > / ,
5532 lookbehind : true ,
5633 } ,
57- c [ 'string' ] as GrammarToken ,
34+ base [ 'string' ] as GrammarToken ,
5835 ] ,
59- 'char' : c [ 'char' ] ,
60- 'comment' : c [ 'comment' ] ,
36+ 'char' : base [ 'char' ] ,
37+ 'comment' : base [ 'comment' ] ,
6138 'macro-name' : [
6239 {
6340 pattern : / ( ^ # \s * d e f i n e \s + ) \w + \b (? ! \( ) / i,
@@ -79,27 +56,48 @@ export default {
7956 'punctuation' : / # # | \\ (? = [ \r \n ] ) / ,
8057 'expression' : {
8158 pattern : / \S [ \s \S ] * / ,
82- inside : c ,
59+ inside : 'c' ,
8360 } ,
8461 } ,
8562 } ,
8663 } ) ;
8764
88- insertBefore ( c , 'function' , {
65+ insertBefore ( base , 'function' , {
8966 // highlight predefined macros as constants
9067 'constant' :
9168 / \b (?: E O F | N U L L | S E E K _ C U R | S E E K _ E N D | S E E K _ S E T | _ _ D A T E _ _ | _ _ F I L E _ _ | _ _ L I N E _ _ | _ _ T I M E S T A M P _ _ | _ _ T I M E _ _ | _ _ f u n c _ _ | s t d e r r | s t d i n | s t d o u t ) \b / ,
9269 } ) ;
9370
94- delete c [ 'boolean' ] ;
71+ delete base [ 'boolean' ] ;
9572
9673 /* OpenCL host API */
9774 const extensions = getOptionalLanguage ( 'opencl-extensions' ) ;
9875 if ( extensions ) {
99- insertBefore ( c , 'keyword' , extensions ) ;
100- delete c [ 'type-opencl-host-cpp' ] ;
76+ insertBefore ( base , 'keyword' , extensions ) ;
77+ delete base [ 'type-opencl-host-cpp' ] ;
10178 }
10279
103- return c ;
80+ return {
81+ 'comment' : {
82+ pattern : / \/ \/ (?: [ ^ \r \n \\ ] | \\ (?: \r \n ? | \n | (? ! [ \r \n ] ) ) ) * | \/ \* [ \s \S ] * ?(?: \* \/ | $ ) / ,
83+ greedy : true ,
84+ } ,
85+ 'string' : {
86+ // https://en.cppreference.com/w/c/language/string_literal
87+ pattern : / " (?: \\ (?: \r \n | [ \s \S ] ) | [ ^ " \\ \r \n ] ) * " / ,
88+ greedy : true ,
89+ } ,
90+ 'class-name' : {
91+ pattern :
92+ / ( \b (?: e n u m | s t r u c t ) \s + (?: _ _ a t t r i b u t e _ _ \s * \( \( [ \s \S ] * ?\) \) \s * ) ? ) \w + | \b [ a - z ] \w * _ t \b / ,
93+ lookbehind : true ,
94+ } ,
95+ 'keyword' :
96+ / \b (?: _ A l i g n a s | _ A l i g n o f | _ A t o m i c | _ B o o l | _ C o m p l e x | _ G e n e r i c | _ I m a g i n a r y | _ N o r e t u r n | _ S t a t i c _ a s s e r t | _ T h r e a d _ l o c a l | _ _ a t t r i b u t e _ _ | a s m | a u t o | b r e a k | c a s e | c h a r | c o n s t | c o n t i n u e | d e f a u l t | d o | d o u b l e | e l s e | e n u m | e x t e r n | f l o a t | f o r | g o t o | i f | i n l i n e | i n t | l o n g | r e g i s t e r | r e t u r n | s h o r t | s i g n e d | s i z e o f | s t a t i c | s t r u c t | s w i t c h | t y p e d e f | t y p e o f | u n i o n | u n s i g n e d | v o i d | v o l a t i l e | w h i l e ) \b / ,
97+ 'function' : / \b [ a - z _ ] \w * (? = \s * \( ) / i,
98+ 'number' :
99+ / (?: \b 0 x (?: [ \d a - f ] + (?: \. [ \d a - f ] * ) ? | \. [ \d a - f ] + ) (?: p [ + - ] ? \d + ) ? | (?: \b \d + (?: \. \d * ) ? | \B \. \d + ) (?: e [ + - ] ? \d + ) ? ) [ f u l ] { 0 , 4 } / i,
100+ 'operator' : / > > = ? | < < = ? | - > | ( [ - + & | : ] ) \1| [ ? : ~ ] | [ - + * / % & | ^ ! = < > ] = ? / ,
101+ } ;
104102 } ,
105103} as LanguageProto < 'c' > ;
0 commit comments