2 // Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 // and is available at http://www.eclipse.org/legal/epl-v10.html
8 parser grammar YangStatementParser;
11 tokenVocab = YangStatementLexer;
14 // NOTE: we need to use SEP*/SEP+ because comments end up breaking whitespace
15 // sequences into two.
16 file : SEP* statement SEP* EOF;
17 statement : keyword (SEP+ argument)? SEP* (SEMICOLON | LEFT_BRACE SEP* (statement SEP*)* RIGHT_BRACE);
18 keyword : IDENTIFIER (COLON IDENTIFIER)?;
20 // Alright, so what constitutes a string is rather funky. We need to deal with
21 // the flaky definitions of RFC6020, which allow for insane quoting as well as
22 // exclusion of comments. We also need to allow for stitching back tokens like
23 // PLUS/COLON, which may end up being valid identifiers. Finally we need to allow
24 // IDENTIFIER to be concatenated back to a string -- but it is common enough
25 // so we want to specialize it.
26 argument : IDENTIFIER | unquotedString | quotedString (SEP* PLUS SEP* quotedString)*;
29 DQUOT_START DQUOT_STRING? DQUOT_END
31 SQUOT_START SQUOT_STRING? SQUOT_END
34 unquotedString : SLASH | STAR+ | (SLASH? | STAR*) stringPart+ (SLASH? | STAR*);
36 // A string which is guaranteed to not have slash/star in either start or end
37 // and can thus be concatenated without allowing '/*', '//' and '*/' to appear.
39 (IDENTIFIER | COLON | PLUS | UQUOT_STRING)+
41 stringPart SLASH stringPart
43 stringPart STAR+ stringPart