首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算理论-语法和句法分析

计算理论-语法和句法分析
EN

Stack Overflow用户
提问于 2014-01-30 09:00:29
回答 1查看 400关注 0票数 0

我正在研究语法和句法分析(计算理论)。以/*开头,以*/结尾,中间不包含*/的C样式注释的语法是什么?字符串/**a/*a**/的解析树是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-08 21:10:55

确保注释文本中的*可以:

  • <text> ::= "*":最后出现在注释文本(终端符号)上,如/*969969**/。注意,在*属于注释文本之前的最后一个*/
  • <text> ::= "*" "[not a slash]" <text>:除了斜杠之外,任何东西都放在前面,这样*/只能被父规则捕获,并被视为终端符号。

更正式地:

代码语言:javascript
复制
<comment> ::= "/*" <text> "*/"
<text> ::=  <starless> <text> | "*" <slashless> <text> | "*" | ""

<starless> ::= "a" | "b" | "c" |... all printable except "*"
<slashless> ::= "a" | "b" | "c" |... all printable except "/"

正如您所看到的,只有在满足两个给定规则时,*才允许出现在文本中。

生成/**a/*a**/的解析树如下所示:

代码语言:javascript
复制
                    comment
              +--------+----+
             /       text    \
            /          |      \
           /  +--------+       \
          /  /        /|        \
         /  /        / |         \
        /  /        /  |          \
       /  / slashless text        :
      /  /   /         |          :     
     /  /   /       +--+          :      
    /  /   /       /   |          :       
   /  /   /  starless text        :             
  /  /   /    /        |          :                 
 /  /   /    /     +---+---+      :             
 :  :  :    :     /    |    \     :      
 :  :  :    :    / slashless text :       
 :  :  :    :    :    :      :    : 
/*  *  a    /    *    a      *   */  

这些规则不适用于真正的C源代码。您需要定义可能“竞争”此类符号( str = "/*Not a comment*/" )的规则:派生双引号字符串、内联注释、预处理器指令等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21451808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档