一个简单的 C++ 程序示例的 BNF 语法
BNF grammar for a simple c++ program example
所以我正在尝试为一个简单的 c++ 程序编写语法。
语法现在是这样的:
PDefs. Program ::= [Def] ;
terminator Def "" ;
comment "//" ;
comment "/*" "*/" ;
comment "#" ;
DFun. Def ::= Type Id "(" [Arg] ")" "{" [Stm] "}" ;
separator Arg "," ;
terminator Stm "" ;
ADecl. Arg ::= Type Id ;
SExp. Stm ::= Exp ";" ;
SDecl. Stm ::= Type Id ";" ;
SDecls. Stm ::= Type Id "," [Id] ";" ;
SInit. Stm ::= Type Id "=" Exp ";" ;
SReturn. Stm ::= "return" Exp ";" ;
SWhile. Stm ::= "while" "(" Exp ")" Stm ;
SBlock. Stm ::= "{" [Stm] "}" ;
SIfElse. Stm ::= "if" "(" Exp ")" Stm "else" Stm ;
EInt. Exp15 ::= Integer ;
EDouble. Exp15 ::= Double ;
ETrue. Exp15 ::= "true" ;
EFalse. Exp15 ::= "false" ;
EId. Exp15 ::= Id ;
EApp. Exp15 ::= Id "(" [Exp] ")" ;
EPIncr. Exp14 ::= Exp15 "++" ;
EPDecr. Exp14 ::= Exp15 "--" ;
EIncr. Exp13 ::= "++" Exp14 ;
EDecr. Exp13 ::= "--" Exp14 ;
ETimes. Exp12 ::= Exp12 "*" Exp13 ;
EDiv. Exp12 ::= Exp12 "/" Exp13 ;
EPlus. Exp11 ::= Exp11 "+" Exp12 ;
EMinus. Exp11 ::= Exp11 "-" Exp12 ;
ELt. Exp9 ::= Exp9 "<" Exp10 ;
EGt. Exp9 ::= Exp9 ">" Exp10 ;
ELtEq. Exp9 ::= Exp9 "<=" Exp10 ;
EGtWq. Exp9 ::= Exp9 ">=" Exp10 ;
EEq. Exp8 ::= Exp8 "==" Exp9 ;
ENEq. Exp8 ::= Exp8 "!=" Exp9 ;
EAnd. Exp4 ::= Exp4 "&&" Exp5 ;
EOr. Exp3 ::= Exp3 "||" Exp4 ;
EAss. Exp2 ::= Exp3 "=" Exp2 ;
coercions Exp 15 ;
separator Exp "," ;
separator Id "," ;
Tbool. Type ::= "bool" ;
Tdouble. Type ::= "double" ;
Tint. Type ::= "int" ;
Tvoid. Type ::= "void" ;
token Id (letter (letter | digit | '_')*) ;
这是需要解析的简单c++程序
// a small C++ program
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
所以当我尝试解析它时,我在第 6 行中得到错误,意思是 std::cout 行。因为我是 bnf 的新手,所以我不知道如何 "think" 来解决这个问题。如果有人能举例说明您将如何解决这种情况,那就太好了。!
谢谢!
失败的行无法解析,因为您缺少一些规则:
您需要一个规则来解析合格的 ID。
限定 id 是一种特殊类型的标识符,可以(出于您的目的)在与(非限定)标识符相同的情况下使用。
std::cout
和 std::endl
是合格的 ID,它们的(简化的)规则看起来像这样:
<qualified_id> ::= <nested_name_specifier> <unqualified_id>
<nested_name_specifier> ::= <namespace_name> "::" <nested_name_specifier>?
其中(为了您的目的), 和 可以是被视为标识符。
您需要一个规则来解析带有 <<
运算符的表达式.
这种额外类型的表达式的(简化)规则可能看起来像这样:
<shift_left_expression> ::= <other_expression>
<shift_left_expression> ::= <shift_left_expression> "<<" <other_expression>
其中(出于您的目的) 代表任何其他类型的表达式。
您需要一个规则来解析 字符串文字。
字符串文字是文字的一种类型,它可以(出于您的目的)用作表达式的一部分,如标识符。
"Hello, world!"
是一个字符串文字,它们的(简化的)规则看起来像这样:
<string_literal> ::= "\"" <s_char_sequence>? "\""
<s_char_sequence> ::= <s_char>
<s_char_sequence> ::= <s_char_sequence> <s_char>
其中 是您希望在字符串文字中允许的任何字符(为简单起见,不允许 "
那里的字符,例如。).
所以我正在尝试为一个简单的 c++ 程序编写语法。
语法现在是这样的:
PDefs. Program ::= [Def] ;
terminator Def "" ;
comment "//" ;
comment "/*" "*/" ;
comment "#" ;
DFun. Def ::= Type Id "(" [Arg] ")" "{" [Stm] "}" ;
separator Arg "," ;
terminator Stm "" ;
ADecl. Arg ::= Type Id ;
SExp. Stm ::= Exp ";" ;
SDecl. Stm ::= Type Id ";" ;
SDecls. Stm ::= Type Id "," [Id] ";" ;
SInit. Stm ::= Type Id "=" Exp ";" ;
SReturn. Stm ::= "return" Exp ";" ;
SWhile. Stm ::= "while" "(" Exp ")" Stm ;
SBlock. Stm ::= "{" [Stm] "}" ;
SIfElse. Stm ::= "if" "(" Exp ")" Stm "else" Stm ;
EInt. Exp15 ::= Integer ;
EDouble. Exp15 ::= Double ;
ETrue. Exp15 ::= "true" ;
EFalse. Exp15 ::= "false" ;
EId. Exp15 ::= Id ;
EApp. Exp15 ::= Id "(" [Exp] ")" ;
EPIncr. Exp14 ::= Exp15 "++" ;
EPDecr. Exp14 ::= Exp15 "--" ;
EIncr. Exp13 ::= "++" Exp14 ;
EDecr. Exp13 ::= "--" Exp14 ;
ETimes. Exp12 ::= Exp12 "*" Exp13 ;
EDiv. Exp12 ::= Exp12 "/" Exp13 ;
EPlus. Exp11 ::= Exp11 "+" Exp12 ;
EMinus. Exp11 ::= Exp11 "-" Exp12 ;
ELt. Exp9 ::= Exp9 "<" Exp10 ;
EGt. Exp9 ::= Exp9 ">" Exp10 ;
ELtEq. Exp9 ::= Exp9 "<=" Exp10 ;
EGtWq. Exp9 ::= Exp9 ">=" Exp10 ;
EEq. Exp8 ::= Exp8 "==" Exp9 ;
ENEq. Exp8 ::= Exp8 "!=" Exp9 ;
EAnd. Exp4 ::= Exp4 "&&" Exp5 ;
EOr. Exp3 ::= Exp3 "||" Exp4 ;
EAss. Exp2 ::= Exp3 "=" Exp2 ;
coercions Exp 15 ;
separator Exp "," ;
separator Id "," ;
Tbool. Type ::= "bool" ;
Tdouble. Type ::= "double" ;
Tint. Type ::= "int" ;
Tvoid. Type ::= "void" ;
token Id (letter (letter | digit | '_')*) ;
这是需要解析的简单c++程序
// a small C++ program
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
所以当我尝试解析它时,我在第 6 行中得到错误,意思是 std::cout 行。因为我是 bnf 的新手,所以我不知道如何 "think" 来解决这个问题。如果有人能举例说明您将如何解决这种情况,那就太好了。!
谢谢!
失败的行无法解析,因为您缺少一些规则:
您需要一个规则来解析合格的 ID。
限定 id 是一种特殊类型的标识符,可以(出于您的目的)在与(非限定)标识符相同的情况下使用。
std::cout
和std::endl
是合格的 ID,它们的(简化的)规则看起来像这样:<qualified_id> ::= <nested_name_specifier> <unqualified_id> <nested_name_specifier> ::= <namespace_name> "::" <nested_name_specifier>?
其中(为了您的目的),
和 可以是被视为标识符。 您需要一个规则来解析带有
<<
运算符的表达式.
这种额外类型的表达式的(简化)规则可能看起来像这样:<shift_left_expression> ::= <other_expression> <shift_left_expression> ::= <shift_left_expression> "<<" <other_expression>
其中(出于您的目的)
代表任何其他类型的表达式。 您需要一个规则来解析 字符串文字。
字符串文字是文字的一种类型,它可以(出于您的目的)用作表达式的一部分,如标识符。
"Hello, world!"
是一个字符串文字,它们的(简化的)规则看起来像这样:<string_literal> ::= "\"" <s_char_sequence>? "\"" <s_char_sequence> ::= <s_char> <s_char_sequence> ::= <s_char_sequence> <s_char>
其中
是您希望在字符串文字中允许的任何字符(为简单起见,不允许 "
那里的字符,例如。).