|
Does this GOLD CC allow for multiple token lookahead or is it strictly LALR(1)?
Cheers!
"I had the right to remain silent, but I didn't have the ability!"
Ron White, Comedian
|
|
|
|
|
I've been dabbling for a bit in ANTLR[^] which is actually a Java project by a cool professor. There is also a C# port available, just look here: http://www.antlr.org/download.html[^].
If I remember correctly ANTLR is LL(K) which should help with your problem. I haven't really done any serious work with compilers the last eight years so guess I'm not of to much help there.
Cheers!
"I had the right to remain silent, but I didn't have the ability!"
Ron White, Comedian
|
|
|
|
|
Quote: Does this GOLD CC allow for multiple token lookahead or is it strictly LALR(1)? It's strictly LALR(1).
Without knowing too much about parsers I had a gut feeling this might be the issue here. But I'm hoping that it's somehow possible to write the grammar in a way that one lookahead will suffice without butchering the syntax
The reason why I don't want to use another parser generator is that there's a framework/execution engine for GOLD which simplifies and beautifies the code you have to write for your interpreter - take a look at this:
public class If : Statement
{
private readonly Expression _test;
private readonly Statement _falseStatement;
private readonly Statement _trueStatement;
[Rule(@"<Stm> ::= ~if ~'(' <Expr> ~')' <Stm>")]
public If(Expression _test, Statement trueStatement)
: this(_test, trueStatement, null)
{
}
[Rule(@"<Stm> ::= ~if ~'(' <Expr> ~')' <Then Stm> ~else <Stm>")]
[Rule(@"<Then Stm> ::= ~if ~'(' <Expr> ~')' <Then Stm> ~else <Then Stm>")]
public If(Expression test, Statement trueStatement, Statement falseStatement)
{
_test = test;
_trueStatement = trueStatement;
_falseStatement = falseStatement;
}
protected override void DoExecute(IExecutionContext ctx)
{
if (Convert.ToBoolean(_test.GetValue(ctx)))
_trueStatement.Execute(ctx);
else if (_falseStatement != null)
_falseStatement.Execute(ctx);
}
}
You basically have nothing to do than write classes "like that" for your productions, put a Rule-attribute on the constructor(s), feed a source code into a "SematicProcessor"-class of that framework and it'll instantiate all those classes for you representing the fed program and you can call DoExecute(..) on the top node
It's for "yet another embeddable scripting engine" I wrote mainly for self-education. It doesn't bring a whole lot of new features to the table but it has a (IMO) very interesting twist which is why I intend to write an article about it. It's 90% finished (ignoring generics) so I wouldn't want to switch to another parser generator just for being able to replicate the C# syntax for generics - but it would be nice to have because you could just "drop in" existing C# code.
cheers, Sascha
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
Wow, that rule attribute is sweet!
Does GOLD also build an abstract syntax tree (AST)?
AST is one of the neat things about ANTLR. You can go over the syntax tree in multiple passes if you wish to and can do all sorts of optimizations on it.
Coming back to your problem: I remember doing some YACC stuff at uni and IIRC you can tell it try the shift first and if that didn't work out it'll do the reduce later.
This is what I found on the GOLD.org site:
Gold.org: Versions 2.4 and later of the GOLD Parser Builder automatically fixes Shift-Reduce Conflicts by not "reducing" when it would cause a conflict. This is the same behavior of the YACC compiler-compiler. It is best to closely check these states to determine if the "shift" is the action wanted.
So what version are you using then?
Cheers!
"I had the right to remain silent, but I didn't have the ability!"
Ron White, Comedian
|
|
|
|
|
Wrong Site URL. It is http://goldparser.org/[^] not gold.org
What do you get when you cross a joke with a rhetorical question?
The metaphorical solid rear-end expulsions have impacted the metaphorical motorized bladed rotating air movement mechanism.
Do questions with multiple question marks annoy you???
|
|
|
|
|
Oh wow, glad you noticed that! Thanks for your, ehemm, contribution!
"I had the right to remain silent, but I didn't have the ability!"
Ron White, Comedian
|
|
|
|
|
I was rather confused by what popped up at the address you had in your post. I think others (esp. Noobs) might be as well.
What do you get when you cross a joke with a rhetorical question?
The metaphorical solid rear-end expulsions have impacted the metaphorical motorized bladed rotating air movement mechanism.
Do questions with multiple question marks annoy you???
|
|
|
|
|
I just had to download that GOLD ParserBuilder and try it out with your grammar.
As expected it showed only warnings of the Shift-Reduce conflict, but it produced the egt file just fine.
So it should work for you too, me thinks.
The Shift in favor of the reduce is totally acceptable if (pretty big if eh?) GOLD backtracks when subsequent tokens let the chosen production fail (That's the one it shifted on). So eventually it would fall back on the reduce production which is the compare expression production in your case.
What I just saw from 15 minutes of looking at this thing, I must say I'm pretty much impressed. Not only can you inspect the generated automaton, but also the messages for the conflicts were the best and most easily understandable compared to any of the CCs I have seen so far. (YACC, PROGRAMMAR, ANTLR).
What you really should do next is create a test file and run tests on the grammar to see if it can still parse comparisons as well as the generics.
Regards,
Manfred
P.S.: I totally forgot how much fun this is, makes me want to uses this tool for some fun project.
"I had the right to remain silent, but I didn't have the ability!"
Ron White, Comedian
|
|
|
|
|
Thank you for your effort, Manfred!
Initially I thought you might have solved the problem for me, pointing me to the shift-over-reduce precedence. I "theoretically" knew about this but (I guess) when I read it months ago I decided to go with my usual policy "warnings are errors" and disregarded that it might ever be a valid option.
But unfortunately it doesn't seem to be the solution (at least not by itself) because GOLD apparently does not backtrack: When trying to parse "var a = b < c;" the parser doesn't attempt the reduction and gives a syntax error. Looks like end of story?
Manfred R. Bihy wrote: P.S.: I totally forgot how much fun this is, makes me want to uses this tool for some fun project. I think you'll enjoy my upcoming article - even with <:T> -syntax!
Cheers, Sascha
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
Momentarily I have the same result, but I still have an ace up my sleeve. If I find a solution I'll keep you updated.
Cheers!
"I had the right to remain silent, but I didn't have the ability!"
Ron White, Comedian
|
|
|
|
|
Manfred R. Bihy wrote: but I still have an ace up my sleeve Feels like christmas anticipation
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
Manfred, I found that my implementation for generics in the grammar is flawed, it's not possible to write "nested" generics like A<B<int>> . This is just FYI, I'll try to fix it and update the grammar in my original post.
cheers, Sascha
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
Hi Manfred,
I think I've fixed the "generics nesting" in the grammar; I updated it in my original post. I also identified those productions that cause a conflict (5) and marked them with "<<<<< Shift-Reduce-Conflict", maybe it's helpful.
Have a nice long weekend -
cheers, Sascha
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
Hi Manfred! Did you get an opportunity yet to try playing your ace?
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
What I had envisioned is not possible with GOLD.
Other programs like Antler allow for state or context switches, but it looks as if this can't be done with
GOLD.
Cheers
"I had the right to remain silent, but I didn't have the ability!"
Ron White, Comedian
|
|
|
|
|
Alright, thank you for trying!
cheers, Sascha
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
HELLO!I know that you only can help me with some problems I might face in my code but i haven;t even understood the code that I have to work on. I am a university student and tomorrow I have to give my exercise to my tutor. I am putting here what I have to do and if anyone could help me in any way I would appreciate it. So I need to work on this: " Build a class that manages points having a fragmentary x and an ordinate y.Build a method "distance" which will calculate the distance between two points.Make another method "a.isFurther(B)" which will be able to find if "a" is further from the origin than "b" (Hint: you can use the previous method). Finally, build a method that checks whether three points are collinear."
|
|
|
|
|
Code Project is not a code-ordering site, and for that it is not a site for homework solving...
If you want help, you have to do the work by yourself, and come here with actual questions about actual problems in your code/solution...
Skipper: We'll fix it.
Alex: Fix it? How you gonna fix this?
Skipper: Grit, spit and a whole lotta duct tape.
|
|
|
|
|
So what have you done so far?
And if it's "nothing" then don't expect us to dig you out of a hole - if you don't even try, then there is no good reasons for helping to avoid a failing grade: we might have to work with you one day and nobody wants to work with someone who doesn't know what he is doing.
So show us what you have so far, and explain what is stopping you going any further. And we might help you to help yourself out of this hole...
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
I have done this so far:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Apostash_Simeiwn
{
class Simeio
{
private double x;
private double y;
public Simeio(double x, double y)
{
this.x = x;
this.y = y;
}
}
}
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void bttApostash_Click(object sender, EventArgs e)
{
txtApostash.Text += Environment.NewLine + Convert.ToString(GetDistance(double.Parse(txtXa.Text),double.Parse(txtXb.Text),double.Parse(txtYa.Text),double.Parse(txtYb.Text)));
}
public static double GetDistance(double txtXa, double txtYa, double txtXb, double txtYb)
{
double a = txtXa - txtXb;
double b = txtYa - txtYb;
double distance;
return distance = Math.Sqrt(a * a + b * b);
}
private void bttOO_Click(object sender, EventArgs e)
{
if (Math.Sqrt(Math.Pow(double.Parse(txtXa.Text), 2) + Math.Pow(double.Parse(txtYa.Text), 2)) < Math.Sqrt(Math.Pow(double.Parse(txtXb.Text), 2) + Math.Pow(double.Parse(txtYb.Text), 2)))
{
txtOO.Text += Environment.NewLine + "Το σημείο Α";
}
else
{
txtOO.Text += Environment.NewLine + "Το σημείο Β";
}
}
private void bttTermatismos_Click(object sender, EventArgs e)
{
Environment.Exit(0);
}
private void bttSineuthiaka_Click(object sender, EventArgs e)
{
double l1 = (double.Parse(txtYb.Text) - double.Parse(txtYa.Text)) / (double.Parse(txtXb.Text) - double.Parse(txtXa.Text));
double l2 = (double.Parse(txtYc.Text) - double.Parse(txtYb.Text)) / (double.Parse(txtXc.Text) - double.Parse(txtXb.Text));
if (l1 == l2)
{
txtSineuthiaka.Text += Environment.NewLine + "Τα σημεία είναι συνευθειακά ";
}
else
{
MessageBox.Show("Δεν είναι συνευθειακά.Εισάγετε νέα");
}
}
}
}
|
|
|
|
|
Just a small hint: The assignment didn't say you need to have a Form. So you could just do it with a console application. Maybe that will save you some effort and let you concentrate on the actual task.
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
he did say it. i just forgot to write it here
|
|
|
|
|
So?
Start with a Console application and make sure your class works first, then make a Forms app using that class.
|
|
|
|
|
I am trying to load subreport in a main report is loading properly, but while loading subreport getting "object reference not set to an instance error in catch". Can someone help me on this please?
Vijay
|
|
|
|
|
Without the relevant code fragment?
No, probably not...
Have you tried using the debugger to look at exactly what you are passing to CR?
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|