如何画以下两个BNF语言的铁路图

好的,请问这两个题该怎么画图呢?就类似与这种图,可以使用分支和循环去画
第一题

S := UPPER { D }
D := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
UPPER := 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'

第二题

CODE_Snippet ::=
"begin"
EXPR
"end"
EXPR ::= CODE_Snippet | expression ";" | EXPR { EXPR }

img

分支

img

循环

img

这次是用 EBNF 来描述了?如果是这样,我一会再答,我琢磨琢磨百度出来的内容


loop_statment ::= D | F | V , { space* , '+' , space* , D | F | V }

branch_statment :: = (D | F | V , space* , '+' , space* , D | F | V)
    | (D | F | V , space* , '*' , space* , D | F | V)
    | ('(' , space* , D | F | V , space* , ')')
    | 'a'
    | 'b'
    | 'c'
 
V = letter+ ( [digit | letter | '_']+ )?
F = '-'? digit+ ('.' digit+)?
D = '-'? digit+
letter = "A" | "B" | "C" | "D" | "E" | "F" | "G"
       | "H" | "I" | "J" | "K" | "L" | "M" | "N"
       | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
       | "V" | "W" | "X" | "Y" | "Z" | "a" | "b"
       | "c" | "d" | "e" | "f" | "g" | "h" | "i"
       | "j" | "k" | "l" | "m" | "n" | "o" | "p"
       | "q" | "r" | "s" | "t" | "u" | "v" | "w"
       | "x" | "y" | "z" ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
space = ? white space characters ?;

V 的定义是 variable,也就是变量,字母开头,后边可以跟字母和数字下划线
D 的定义是正负整数
F 的定义是正负浮点数
space* ,这个*表示长度,类似正则,表示0或多个,和{}的意义一致,EBNF有做这个支持

我在这里只考虑了整数,浮点数和变量名,函数、方法之类的没有考虑,我觉得应该够用了