我正在研究语法和句法分析(计算理论)。以/*开头,以*/结尾,中间不包含*/的C样式注释的语法是什么?字符串/**a/*a**/的解析树是什么?
发布于 2014-02-08 21:10:55
确保注释文本中的*可以:
<text> ::= "*":最后出现在注释文本(终端符号)上,如/*969969**/。注意,在*属于注释文本之前的最后一个*/。<text> ::= "*" "[not a slash]" <text>:除了斜杠之外,任何东西都放在前面,这样*/只能被父规则捕获,并被视为终端符号。更正式地:
<comment> ::= "/*" <text> "*/"
<text> ::= <starless> <text> | "*" <slashless> <text> | "*" | ""
<starless> ::= "a" | "b" | "c" |... all printable except "*"
<slashless> ::= "a" | "b" | "c" |... all printable except "/"正如您所看到的,只有在满足两个给定规则时,*才允许出现在文本中。
生成/**a/*a**/的解析树如下所示:
comment
+--------+----+
/ text \
/ | \
/ +--------+ \
/ / /| \
/ / / | \
/ / / | \
/ / slashless text :
/ / / | :
/ / / +--+ :
/ / / / | :
/ / / starless text :
/ / / / | :
/ / / / +---+---+ :
: : : : / | \ :
: : : : / slashless text :
: : : : : : : :
/* * a / * a * */ 这些规则不适用于真正的C源代码。您需要定义可能“竞争”此类符号( str = "/*Not a comment*/" )的规则:派生双引号字符串、内联注释、预处理器指令等。
https://stackoverflow.com/questions/21451808
复制相似问题