1+ grammar BCompNG;
2+
3+ prog
4+ : (line? EOL )*
5+ ;
6+
7+ line
8+ : comment
9+ | instructionLine
10+ | directive
11+ | lbl
12+ ;
13+
14+ instructionLine
15+ : lbl? instruction comment?
16+ ;
17+
18+ instruction
19+ : addr operand
20+ | nonaddr
21+ | branch label
22+ | io dev
23+ ;
24+
25+ directive
26+ : org orgAddress comment?
27+ | wordDirective
28+ | end comment?
29+ ;
30+
31+ orgAddress
32+ : address
33+ ;
34+
35+ wordDirective
36+ : lbl? word wordArguments comment?
37+ ;
38+
39+ wordArguments
40+ : wordArgument ( ' ,' wordArgument )*
41+ ;
42+
43+ wordArgument
44+ : number
45+ | ' $' label
46+ ;
47+
48+ lbl
49+ : label ' :'
50+ ;
51+
52+ label
53+ : name
54+ ;
55+
56+ dev
57+ : number
58+ ;
59+
60+ operand
61+ : directAbsolute
62+ | indirect
63+ | postIncrement
64+ | preDecrement
65+ | displacementSP
66+ | directRelative
67+ | directLoad
68+ ;
69+
70+ directAbsolute
71+ : address
72+ | ' $' label
73+ ;
74+
75+ indirect
76+ : ' (' label ' )'
77+ ;
78+
79+ postIncrement
80+ : ' (' label ' )' ' +'
81+ ;
82+
83+ preDecrement
84+ : ' -' ' (' label ' )'
85+ ;
86+
87+ displacementSP
88+ : ' &' number
89+ | ' (' sp ' +' number ' )'
90+ ;
91+
92+ directRelative
93+ : label
94+ ;
95+
96+ directLoad
97+ : ' #' number
98+ ;
99+
100+ address
101+ : number
102+ ;
103+
104+ string
105+ : STRING
106+ ;
107+
108+ name
109+ : NAME
110+ ;
111+
112+ number
113+ : DECIMAL
114+ | HEX
115+ ;
116+
117+ comment
118+ : COMMENT
119+ ;
120+
121+ addr : AND | OR | ADD | ADC | SUB | CMP | LOOP | LD | SWAM | JUMP | CALL | ST ;
122+ nonaddr : NOP | HLT | CLA | NOT | CLC | CMC | ROL | ROR | ASL | ASR | SXTB | SWAB |
123+ INC | DEC | NEG | POP | POPF | RET | IRET | PUSH | PUSHF | SWAP ;
124+ branch : BEQ | BNE | BMI | BPL | BCS | BCC | BVS | BVC | BLT | BGE | BR ;
125+ io : CLF | TSF | IN | OUT ;
126+
127+ sp : SP ;
128+ ip : IP ;
129+
130+ org : ORG ;
131+ word : WORD ;
132+ end : END ;
133+
134+ fragment A : (' a' | ' A' );
135+ fragment B : (' b' | ' B' );
136+ fragment C : (' c' | ' C' );
137+ fragment D : (' d' | ' D' );
138+ fragment E : (' e' | ' E' );
139+ fragment F : (' f' | ' F' );
140+ fragment G : (' g' | ' G' );
141+ fragment H : (' h' | ' H' );
142+ fragment I : (' i' | ' I' );
143+ fragment J : (' j' | ' J' );
144+ fragment K : (' k' | ' K' );
145+ fragment L : (' l' | ' L' );
146+ fragment M : (' m' | ' M' );
147+ fragment N : (' n' | ' N' );
148+ fragment O : (' o' | ' O' );
149+ fragment P : (' p' | ' P' );
150+ fragment Q : (' q' | ' Q' );
151+ fragment R : (' r' | ' R' );
152+ fragment S : (' s' | ' S' );
153+ fragment T : (' t' | ' T' );
154+ fragment U : (' u' | ' U' );
155+ fragment V : (' v' | ' V' );
156+ fragment W : (' w' | ' W' );
157+ fragment X : (' x' | ' X' );
158+ fragment Y : (' y' | ' Y' );
159+ fragment Z : (' z' | ' Z' );
160+
161+ fragment RA : (' а' | ' А' );
162+ fragment RB : (' б' | ' Б' );
163+ fragment RV : (' в' | ' В' );
164+ fragment RG : (' г' | ' Г' );
165+ fragment RD : (' д' | ' Д' );
166+ fragment RE : (' е' | ' Е' );
167+ fragment RYO : (' ё' | ' Ё' );
168+ fragment RZH : (' ж' | ' Ж' );
169+ fragment RZ : (' з' | ' З' );
170+ fragment RI : (' и' | ' И' );
171+ fragment RK : (' к' | ' К' );
172+ fragment RL : (' л' | ' Л' );
173+ fragment RM : (' м' | ' М' );
174+ fragment RN : (' н' | ' Н' );
175+ fragment RO : (' о' | ' О' );
176+ fragment RP : (' п' | ' П' );
177+ fragment RR : (' р' | ' Р' );
178+ fragment RS : (' с' | ' С' );
179+ fragment RT : (' т' | ' Т' );
180+ fragment RU : (' у' | ' У' );
181+ fragment RF : (' ф' | ' Ф' );
182+ fragment RKH : (' х' | ' Х' );
183+ fragment RTSC : (' ц' | ' Ц' );
184+ fragment RCH : (' ч' | ' Ч' );
185+ fragment RSH : (' ш' | ' Ш' );
186+ fragment RHSIGN : (' ъ' | ' Ъ' );
187+ fragment RII : (' ы' | ' Ы' );
188+ fragment RSSIGN : (' ь' | ' Ь' );
189+ fragment RYE : (' э' | ' Э' );
190+ fragment RYU : (' ю' | ' Ю' );
191+ fragment RYA : (' я' | ' Я' );
192+
193+ fragment HEXDIGIT : [0-9a-fA-F ] ;
194+ fragment DECDIGIT : [0-9] ;
195+ fragment P0X : ' 0' X ;
196+ fragment P0D : ' 0' D ;
197+
198+ /*
199+ * Assembler Instruction
200+ */
201+ ORG : O R G ;
202+ WORD : W O R D ;
203+ END : E N D ;
204+
205+ /*
206+ * opcodes
207+ */
208+
209+ AND : ( A N D ) | ( RI );
210+ OR : ( O R ) | ( RI RL RI );
211+ ADD : ( A D D ) | ( RP RL RYU RS );
212+ ADC : ( A D C ) | ( RP RL RYU RS RS );
213+ SUB : ( S U B ) | ( RM RI RN RU RS );
214+ CMP : ( C M P ) | ( RS RR RA RV );
215+ LOOP : ( L O O P ) | ( RK RR RU RG );
216+ LD : ( L D ) | ( RN RYA RM );
217+ SWAM : ( S W A M );
218+ JUMP : ( J U M P ) | ( RP RR RII RG );
219+ CALL : ( C A L L ) | ( RV RZH RU RKH );
220+ ST : ( S T ) | ( RT RSSIGN RF RU );
221+
222+ NOP : ( N O P );
223+ HLT : ( H L T );
224+ CLA : ( C L A );
225+ NOT : ( N O T ) | ( C M A ) | ( C O M ) | ( RN RE ) | ( RS RB RA );
226+ CLC : ( C L C ) ;
227+ CMC : ( C M C ) ;
228+ ROL : ( R O L ) ;
229+ ROR : ( R O R ) ;
230+ ASL : ( A S L ) ;
231+ ASR : ( A S R ) ;
232+ SXTB : ( S X T B ) ;
233+ SWAB : ( S W A B ) ;
234+ INC : ( I N C ) ;
235+ DEC : ( D E C ) ;
236+ NEG : ( N E G ) ;
237+ POP : ( P O P ) ;
238+ POPF : ( P O P F ) ;
239+ RET : ( R E T ) ;
240+ IRET : ( I R E T ) ;
241+ PUSH : ( P U S H ) ;
242+ PUSHF : ( P U S H F );
243+ SWAP : ( S W A P ) ;
244+
245+ BEQ : ( B E Q ) | ( B Z S );
246+ BNE : ( B N E ) | ( B Z C );
247+ BMI : ( B M I ) | ( B N S );
248+ BPL : ( B P L ) | ( B N C );
249+ BCS : ( B C S ) | ( B L O );
250+ BCC : ( B C C ) | ( B H I S );
251+ BVS : ( B V C ) ;
252+ BVC : ( B V C ) ;
253+ BLT : ( B L T ) ;
254+ BGE : ( B G E ) ;
255+ BR : ( B R ) ; // syntetic insturction, jump with direct relative addressing mode
256+
257+
258+ CLF : ( C L F ) ;
259+ TSF : ( T S F ) ;
260+ IN : ( I N ) ;
261+ OUT : ( O U T ) ;
262+
263+ SP : ( S P ) ;
264+ IP : ( I P ) ;
265+
266+ NAME
267+ : [a-zA-Z а-яА-Я] [a-zA-Z а-яА-Я0-9." ]*
268+ ;
269+
270+ DECIMAL
271+ : P0D? DECDIGIT+
272+ ;
273+
274+ HEX
275+ : HEXDIGIT+ | (P0X HEXDIGIT+ ) | ( HEXDIGIT+ H )
276+ ;
277+
278+ COMMENT
279+ : ';' ~ [\r\n ]* -> skip
280+ ;
281+
282+
283+ STRING
284+ : '" ' ~ ["]* ' " '
285+ ;
286+
287+
288+ EOL
289+ : [\r\n ] +
290+ ;
291+
292+
293+ WS
294+ : [ \t ] -> skip
295+ ;
0 commit comments