<div dir="ltr">Ah, right, now I get what you mean. Do some preprocessing between lexing and parsing. Yes, that way I think it'll work. Thanks!</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 3, 2016 at 5:46 PM, Jesper Louis Andersen <span dir="ltr"><<a href="mailto:jesper.louis.andersen@gmail.com" target="_blank">jesper.louis.andersen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div>Just parse it as {id, "P"} and then use the parser to figure out if this is valid in that position. In the format you may want to keep the newlines explicit in the tokenized output since it seems to be significant. In some programs you have a set of valid keywords, in which case you can write a function:<br><br></div>keyword("P") -> {cmd, "P"};<br></div><div>keyword("U") -> {cmd, "U"};<br>...<br></div>keyword(ID) -> {id, ID}.<br><br></div>but note that this means that P and U are really only occurring in the input as special markers and have no other way to occur. You often use this in the situation where you have a construction such as 'if...then...else' in a typical programming language: you want those parsed specially, not as general identifiers (i.e., variables and other stuff).<br><br><div><br></div></div><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Mon, Oct 3, 2016 at 4:37 PM Metin Akat <<a href="mailto:akat.metin@gmail.com" target="_blank">akat.metin@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_6889291289733353560gmail_msg"><div style="font-size:12.8px" class="m_6889291289733353560gmail_msg">[{cmd, "P"}, {int, 2015}, '/', {int, 11}, '/', {int, 21}, {int, 2}, ':', ...<br class="m_6889291289733353560gmail_msg"></div><div style="font-size:12.8px" class="m_6889291289733353560gmail_msg"> {id, "USD"}, {float, 1.1}, {id, "EUR}]</div><div style="font-size:12.8px" class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div></div><div dir="ltr" class="m_6889291289733353560gmail_msg"><div style="font-size:12.8px" class="m_6889291289733353560gmail_msg">In this case, how does your lexer know to parse the "P" to {cmd, "P} and the "EUR" to {id, "EUR"}? The only way I can think of is to check if the P is in the beginning of the line (which would totally suffice)</div><div style="font-size:12.8px" class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div style="font-size:12.8px" class="m_6889291289733353560gmail_msg">Otherwise, yeah... if I am to write my own lexer... then I guess my whole question is pointless.</div></div><div class="gmail_extra m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"><div class="gmail_quote m_6889291289733353560gmail_msg">On Mon, Oct 3, 2016 at 5:24 PM, Jesper Louis Andersen <span dir="ltr" class="m_6889291289733353560gmail_msg"><<a href="mailto:jesper.louis.andersen@gmail.com" class="m_6889291289733353560gmail_msg" target="_blank">jesper.louis.andersen@gmail.<wbr>com</a>></span> wrote:<br class="m_6889291289733353560gmail_msg"><blockquote class="gmail_quote m_6889291289733353560gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"><div class="gmail_quote m_6889291289733353560gmail_msg"><span class="m_6889291289733353560gmail_msg"><div dir="ltr" class="m_6889291289733353560gmail_msg">On Mon, Oct 3, 2016 at 10:34 AM Metin Akat <<a href="mailto:akat.metin@gmail.com" class="m_6889291289733353560gmail_msg" target="_blank">akat.metin@gmail.com</a>> wrote:<br class="m_6889291289733353560gmail_msg"></div></span><blockquote class="gmail_quote m_6889291289733353560gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_6889291289733353560m_-1845663294473721690m_3651696251216490252gmail_msg m_6889291289733353560gmail_msg"><span class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"><div class="m_6889291289733353560m_-1845663294473721690m_3651696251216490252gmail_msg m_6889291289733353560gmail_msg"><div class="m_6889291289733353560m_-1845663294473721690m_3651696251216490252gmail_msg m_6889291289733353560gmail_msg"><br class="m_6889291289733353560m_-1845663294473721690m_3651696251216490252gmail_msg m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560m_-1845663294473721690m_3651696251216490252gmail_msg m_6889291289733353560gmail_msg">P 2015/11/21 02:18:02 USD 1.1 EUR</div></div><div class="m_6889291289733353560m_-1845663294473721690m_3651696251216490252gmail_msg m_6889291289733353560gmail_msg"><br class="m_6889291289733353560m_-1845663294473721690m_3651696251216490252gmail_msg m_6889291289733353560gmail_msg"></div><br class="m_6889291289733353560gmail_msg"></span><span class="m_6889291289733353560gmail_msg"><div class="m_6889291289733353560m_-1845663294473721690m_3651696251216490252gmail_msg m_6889291289733353560gmail_msg">So my question is: How do I tackle this? Do I just accept "P" as a WORD token and somehow instruct yecc to parse based on the WORD's value? Is it even possible to do?</div><br class="m_6889291289733353560m_-1845663294473721690m_3651696251216490252gmail_msg m_6889291289733353560gmail_msg"></span></div></blockquote><div class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">(This is loosely from memory)<br class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">The reason ^ and $ are not implemented is because they are never needed in an LALR(1) parser/scanner construction. We want the above line to be scanned into<br class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">[{cmd, "P"}, {int, 2015}, '/', {int, 11}, '/', {int, 21}, {int, 2}, ':', ...<br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg"> {id, "USD"}, {float, 1.1}, {id, "EUR}]<br class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">Then we can define a yecc-grammar which can turn these into meaningful constructions:<br class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">Command -> Cmd Date Time Currency Amount Currency<br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">  : {command, $1, $2, $3, {$4, $5, $5}}.<br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">Date -> Year '/' Month '/' Date : {$1, $3, $5}.<br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">Year -> int : $1.<br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">Month -> int : $1.<br class="m_6889291289733353560gmail_msg">...<br class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg">Sometimes, the indentation in the file does matter. But then it can be smarter to code the lexer by hand or pre-pass over the input file and insert markers for newlines etc. In other words, give structure to the input before actually parsing it. This is used in many languages which uses indentation-based-scope: a pre-pass inserts the scope markers based on newlines and indentation. Then the scanner takes over and handles the stream which has structure.<br class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div><div class="m_6889291289733353560gmail_msg"><br class="m_6889291289733353560gmail_msg"></div></div></div>
</blockquote></div><br class="m_6889291289733353560gmail_msg"></div>
</blockquote></div>
</div></div></blockquote></div><br></div>