ANTLR4中的语法



因此,我从github存储库语法v4/DOT/DOT.g4中的DOT.g4语法中获得了灵感。这就是为什么我还有一个DOT文件要解析。

这是我的DOT文件的可能结构:

digraph G {
rankdir=LR
label="n[Büchi]"
labelloc="t"
node [shape="circle"]
I [label="", style=invis, width=0]
I -> 34
0 [label="0", peripheries=2]
0 -> 0 [label="!v_0"]
1 [label="1", peripheries=2]
1 -> 1 [label="!v_2 & !v_5"]
2 [label="2"]
2 -> 1 [label="v_0 & v_1 > 5 & !v_2 & v_3 < 8 & !v_5"]
3 [label="3"]
3 -> 1 [label="v_0 & v_1 > 5 & !v_2 & v_3 < 8 & !v_5"]
4 [label="4"]
4 -> 1 [label="v_1 > 5 & !v_2 & v_3 < 8 & !v_5"]
5 [label="5"]
5 -> 1 [label="v_0 & v_1 > 5 & !v_2 & v_3 < 8 & !v_5"]
}

下面是我从上面的链接修改的grammar.g4文件:

parse: nba| EOF;
nba: STRICT? ( GRAPH | DIGRAPH ) ( initialId? ) '{' stmtList '}';
stmtList : ( stmt ';'? )* ;
stmt: nodeStmt| edgeStmt| attrStmt | initialId '=' initialId;
attrStmt: ( GRAPH | NODE | EDGE )  '[' a_list? ']';
a_list: ( initialId ( '=' initialId  )? ','? )+;
edgeStmt: (node_id) edgeRHS label ',' a_list? ']';
label: ('[' LABEL '=' '"' (id)+ '"' );
edgeRHS: ( edgeop ( node_id ) )+;
edgeop: '->';
nodeStmt: node_id label? ',' a_list? ']';
node_id: initialId ;
id: ID | SPACE | DIGIT | LETTER | SYMBOL | STRING ;
initialId : STRING | LETTER | DIGIT;

这里是lexar规则:

GRAPH: [Gg] [Rr] [Aa] [Pp] [Hh];
DIGRAPH: [Dd] [Ii] [Gg] [Rr] [Aa] [Pp] [Hh];
NODE: [Nn] [Oo] [Dd] [Ee];
EDGE: [Ee] [Dd] [Gg] [Ee];
LABEL: [Ll] [Aa] [Bb] [Ee] [Ll];
/** "a numeral [-]?(.[0-9]+ | [0-9]+(.[0-9]*)? )" */
NUMBER: '-'? ( '.' DIGIT+ | DIGIT+ ( '.' DIGIT* )? );
DIGIT: [0-9];
/** "any double-quoted string ("...") possibly containing escaped quotes" */
STRING: '"' ( '\"' | . )*? '"';
/** "Any string of alphabetic ([a-zA-Z200-377]) characters, underscores
*  ('_') or digits ([0-9]), not beginning with a digit"
*/
ID: LETTER ( LETTER | DIGIT )*;
SPACE: '" "';
LETTER: [a-zA-Zu0080-u00FF_];
SYMBOL: '<'| '>'| '&'| 'U'| '!';
COMMENT: '/*' .*? '*/' -> skip;
LINE_COMMENT: '//' .*? 'r'? 'n' -> skip;
/** "a '#' character is considered a line output from a C preprocessor */
PREPROC: '#' ~[rn]* -> skip;
/*whitespace are ignored from the constructor*/
WS: [ tnr]+ -> skip;

我点击了ANTLR Recognizer部分,该部分为自己创建了java文件和用于解释语法的令牌。现在,我必须构建一个解析器,在该解析器中,我覆盖了一些方法,以将我的Java代码与ANTLR4创建的Java文件相匹配。但首先我想了解我对这种DOT的语法是否正确。我该如何验证?

Re:"我点击了ANTLR识别器";。。。听起来你正在使用某种带有插件或其他ANTLR工具的IDE。使用带有插件的Use VS Code和IntelliJ,但两者都没有";ANTLR识别器";部分(我可以看到(。因此,以下假设使用命令行。这是一个简单的命令行内容,在使用ANTLR时绝对值得尽早学习。(不过,我使用的两个插件都可以从插件中查看令牌流和解析树(

我你跟着";QuickStart";在www.antlr.org上,您将创建grun别名,该别名仅用于此目的。

(假设你的语法名称是DOT(

要转储您的令牌流(所有lexer规则的结果(

grun DOT tokens -tokens

要验证您是否正确解析输入:

grun DOT parse -gui

grun DOT parse -tree

顺便说一句,您不太可能需要重写解析器类。首先看一下访问者和听众。

相关内容

  • 没有找到相关文章

最新更新