簡體   English   中英

一個簡單的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的新手,所以我不知道如何“思考”解決此問題。 如果有人可以舉一個例子說明如何解決這種情況,那就太好了!

謝謝!

失敗的行無法解析,因為您缺少一些規則:

  1. 您需要一個規則來解析合格的ID
    合格的ID是一種特殊的標識符,可以(出於您的目的)在與(不合格的)標識符相同的情況下使用。
    std::coutstd::endl是合格的ID,針對它們的(簡化)規則可能看起來像這樣:

     <qualified_id> ::= <nested_name_specifier> <unqualified_id> <nested_name_specifier> ::= <namespace_name> "::" <nested_name_specifier>? 

    (出於您的目的),其中<unqualified_id><namespace_name>可以被視為標識符。

  2. 您需要使用<<操作符解析表達式的規則。
    這種附加類型的表達式的(簡化)規則如下所示:

     <shift_left_expression> ::= <other_expression> <shift_left_expression> ::= <shift_left_expression> "<<" <other_expression> 

    其中(出於您的目的) <other_expression>代表任何其他類型的表達式。

  3. 您需要一個規則來解析字符串文字
    字符串文字是一種文字,可以(出於您的目的)用作表達式的一部分(例如標識符)。
    "Hello, world!" 是一個字符串文字,它們的(簡化)規則可能類似於以下內容:

     <string_literal> ::= "\\"" <s_char_sequence>? "\\"" <s_char_sequence> ::= <s_char> <s_char_sequence> ::= <s_char_sequence> <s_char> 

    其中<s_char>是您要在字符串文字中允許的任何字符(為簡單起見 ,請勿在其中包含"字符。)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM