我经常听到C++是一种上下文敏感语言的说法.请看以下示例:
a b(c);
这是变量定义还是函数声明?这取决于符号的含义c.如果c是变量,则a b(c);定义名为btype 的变量a.它是直接初始化的c.但是如果c是一个类型,则a b(c);声明一个名为a的函数b,c并返回一个a.
如果您查找无上下文语言的定义,它基本上会告诉您所有语法规则必须具有仅由一个非终端符号组成的左侧.另一方面,上下文敏感语法允许左侧的任意字符串的终端和非终端符号.
浏览"C++编程语言"的附录A,除了左侧的单个非终端符号之外,我找不到单个语法规则.这意味着C++是无上下文的.(当然,在无上下文语言形成上下文敏感语言的子集的意义上,每种无上下文语言也都是上下文敏感的,但这不是重点.)
那么,C++是无上下文还是上下文敏感?
c++ syntax grammar context-free-grammar context-sensitive-grammar
使用lex/yacc编写C++编译器需要多长时间?
我在哪里可以开始使用它?
是否有工具为结构或类自动生成ostream <<运算符?
输入(取自一个Debug-Print函数来统治它们):
typedef struct ReqCntrlT    /* Request control record */
{
  int             connectionID;
  int             dbApplID;
  char            appDescr[MAX_APPDSCR];
  int             reqID;
  int         resubmitFlag;
  unsigned int    resubmitNo;
  char            VCIver[MAX_VCIVER];
  int             loginID;
}   ReqCntrlT;
输出:
std::ostream& operator <<(std::ostream& os, const ReqCntrlT& r) 
{
   os << "reqControl { "
      << "\n\tconnectionID: " << r.connectionID 
      << "\n\tdbApplID: " << r.dbApplID 
      << "\n\tappDescr: " << r.appDescr
      << "\n\treqID: " << r.reqID
      << "\n\tresubmitFlag: " << r.resubmitFlag
      << "\n\tresubmitNo: " << r.resubmitNo
      << "\n\tVCIver: " …我有一组用C语言编写的函数定义,其中一些额外的关键字可以放在一些参数之前(例如,与"unsigned"或"register"相同)我需要分析这些行以及一些函数存根并从它们生成实际的C代码.
这是正确的,Flex/Yacc是最合适的方式吗?
它会比使用正则表达式写一个Shell或Python脚本慢(这可能会变得非常痛苦,因为我认为,如果额外关键字的数量变得更大并且它们的效果会有相当的不同),前提是我对分析器/解析器没有经验(虽然我知道LALR如何完成它的工作)?
Lex/Yacc上有哪些好的材料可以解决类似的问题吗?我能找到的所有论文都使用了与"玩具"计算器相同的原始例子.
任何帮助将不胜感激.
c++ ×3
flex-lexer ×2
yacc ×2
automation ×1
bison ×1
generator ×1
grammar ×1
iostream ×1
parsing ×1
syntax ×1