<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">You can make a minimal MainProgram like this:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  auto mainProgram{MainProgram{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    std::optional<Statement<ProgramStmt>>{},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    SpecificationPart{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      std::list<OpenMPDeclarativeConstruct>{},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      std::list<Statement<Indirection<UseStmt>>>{},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      std::list<Statement<Indirection<ImportStmt>>>{},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      ImplicitPart{std::list<ImplicitPartStmt>{}},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      std::list<DeclarationConstruct>{}},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    ExecutionPart{std::list<ExecutionPartConstruct>{}},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    std::optional<InternalSubprogramPart>{},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    Statement{std::nullopt, EndProgramStmt{std::optional<Name>{}}}}};<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Then make an empty Program and add the MainProgram to it:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  auto program{Program{std::list<ProgramUnit>{}}};<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  program.v.emplace_back(Indirection<MainProgram>{std::move(mainProgram)});<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Tim<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">flang-dev <flang-dev-bounces@lists.llvm.org> on behalf of Mark Dewing via flang-dev <flang-dev@lists.llvm.org><br>
<b>Reply-To: </b>Mark Dewing <markdewing@gmail.com><br>
<b>Date: </b>Tuesday, December 3, 2019 at 2:26 PM<br>
<b>To: </b>"flang-dev@lists.llvm.org" <flang-dev@lists.llvm.org><br>
<b>Subject: </b>[flang-dev] Question on the parser code<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Hi, <o:p></o:p></p>
<div>
<p class="MsoNormal">  I'm trying to understand the F18 parser and the parse tree code by creating some simple examples.   I would like to create a simple parser and also create a parse tree programmatically, but I'm running into some problems.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">For the first step, I added a constructor to ParseState that accepts a std::string (to avoid constructing a CookedSource object).  The following code works:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">#include "token-parsers.h"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">using namespace Fortran::parser;<br>
int main()<br>
{<br>
    std::string test("b");<br>
    ParseState p(test);<br>
    auto p1 =  "a"_ch;<br>
    auto res = p1.Parse(p);<br>
    std::cout << " res = " << res.value_or("no result") << std::endl;<br>
    return 0;<br>
}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif">For the second step, I would like to create a parse tree programmatically and call unparse.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif">The first problem is I am unable to build a MainProgram with a minimal set of inputs.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif">So far, the code to create some of the elements is as follows:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">    SpecificationPart spec{std::list<OpenMPDeclarativeConstruct>{},<br>
                           std::list<Statement<Fortran::common::Indirection<UseStmt>>>{} ,<br>
                           std::list<Statement<Fortran::common::Indirection<ImportStmt>>>{},<br>
                           ImplicitPart{std::list<ImplicitPartStmt>{}},<br>
                           std::list<DeclarationConstruct>{}};<br>
<br>
    ExecutionPart exec{std::list<ExecutionPartConstruct>{}};<br>
<br>
    Statement<EndProgramStmt> end{Statement<EndProgramStmt>{std::nullopt, EndProgramStmt{std::nullopt}}};</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif">The problem is constructing the tuple for the MainProgram  - all these objects cause compile errors when placed in a tuple ("no matching constructor" errors).  If anyone has better example code,
 or instructions on how to do this properly, I would appreciate it.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif">Thanks,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif">Mark Dewing</span><o:p></o:p></p>
</div>
</div>
</div>

<DIV>
<HR>
</DIV>
<DIV>This email message is for the sole use of the intended recipient(s) and may 
contain confidential information.  Any unauthorized review, use, disclosure 
or distribution is prohibited.  If you are not the intended recipient, 
please contact the sender by reply email and destroy all copies of the original 
message. </DIV>
<DIV>
<HR>
</DIV>
</body>
</html>