|
I see nothing wrong with writing your own thing that happens to be able to read the input for someone else's product (if I understood it correctly). Isn't that called backwards compatibility? Backwards compatibility doesn't infer compatibility between your own versions only of an application.
If not backwards compatibility, then call it interoperability. That, too, is A Good Thing(tm). The way I see it, this is how great software behaves, and evolves.
|
|
|
|
|
fair enough. =) and thanks for your feedback
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
Griff has given you the official, formal answer ("Yes you can") but it's an interesting point and one we've stressed over, talked about, tried to systematise, and eventually have sort of thrown our hands in the air about:
Developers often add licences to their code without thinking it through.
Developer A writes the code and says "do with it as you would". Developer B uses the code and it triggers a supernova and sues Developer A. Developer A says 'but I said I'm not legally liable" and the courts say "that's great but that doesn't work in our country".
Developer A writes the code and says "do with it as you would". Developer B unashamedly uses the code to create a product that makes Developer B a billion dollars and more famous than Hugh Grant. Developer A gets upset.
My advice is: go by the letter of what the developer has offered, but we warned that if they have impinged someone's intellectual rights, or written code that's unsafe, or inadvertently cause you to break a law in Yakyakistan then you'll be the one responsible, not them. Having said that, if you know the code has been developed from scratch and there's no SuperNova API exposed then you're probably fine.
BUT: if you yourself release the code for others to use then spend the 5 mins thinking it through and choose wisely[^].
cheers
Chris Maunder
|
|
|
|
|
I love your answer despite it bringing me back to where I am basically at. Fortunately he lives or works out of san francisco or the greater bay area (his product is heavily branded with that and is named after the golden gate bridge i think)
So legally, I am clear. I just hope he doesn't dislike me for it.
I like his tool okay, but it's kind of limited, forces you to load a "compiled grammar" from a file, and is very VB centric (he wrote it in VB) despite it technically being able to render to many languages.
Plus his grammar syntax leaves a lot of room for improvement.
These limitations are why I don't use it. But it's a good product otherwise, and definitely a good piece of freeware.
It's not open source though, and that's disappointing. At least the latest rendition isn't still written in VB6!
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
His licence says
Quote: In the case of the GOLD Parser Engine source code, permission is granted to anyone to alter it and redistribute it freely, subject to the following restrictions:
The origin of this software must not be misrepresented; you must not claim that you wrote the original software.
Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
This notice may not be removed or altered from any source distribution
Which is open source by definition[^].
Use it! Add to it! Make it better! That's the whole point of sharing the code. We do as much as we can then we hope others take on the task and move it forward and years down the line it comes around and we end up downloading some awesome app that used my free code, your free code, and free code from a dozen other developers.
It's why I started CodeProject.
cheers
Chris Maunder
|
|
|
|
|
That's great in theory but he doesn't actually provide the source for it. I decompiled it, but it's obviously from VB.NET (you can always tell, even after it's been mangled to IL and back)
It doesn't matter, because I already have everything but the GUI.
And the main hangup on a gui is a syntax highlighting editor.
Which is a ton of work because you can't just subclass a richedit control. (i've tried)
there's a project here that has one, and maybe I'll use that.
but a gui isn't really on my priorities at the moment.
and I hate the idea of having to go all in on syntax highlighting like that. it's so much effort.
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
codewitch honey crisis wrote: That's great in theory but he doesn't actually provide the source for it.
The GOLD parsing engine was ported to C++ over 20 years ago and is available here: C++ Gold Parser Engine
Best Wishes,
-David Delaune
|
|
|
|
|
He has updated the codebase significantly since then but that's good to know.
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
Well,
There is a more recent C# port (appears to be 5.2.0) located here but I notice that the guy that uploaded it ... did not include a license.
Best Wishes,
-David Delaune
|
|
|
|
|
that's interesting. well, i've already made one, and there's really only so many ways to skin the LALR(1) cat, which is why my code works with his stuff pretty much out of the box.
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
Chris Maunder wrote: It's why I started CodeProject.
WHAT?
It wasn't for the fame, the money and the chicks?
Michael Martin
Australia
"I controlled my laughter and simple said "No,I am very busy,so I can't write any code for you". The moment they heard this all the smiling face turned into a sad looking face and one of them farted. So I had to leave the place as soon as possible."
- Mr.Prakash One Fine Saturday. 24/04/2004
|
|
|
|
|
They were just a bonus - it was pure altruism to start with!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I'm laughing a wry, hollow, laugh.
cheers
Chris Maunder
|
|
|
|
|
We all know about the CP Groupies.
That's why you keep running off back to Oz - exhaustion!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
|
there will be no confusion about that. my project is entirely distinct, and if anything would just have an import feature. There is no cross-polination going on. It would be like Libre Office importing a word document.
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
Having been bitten by a similar disappearing parser generator in the past, I'd suggest you're doing people a service...
Personally, I moved over to ANTLR after that, but these days, I try to keep to parser combinator libraries - at least if I'm compiling from source, I can configure it easily & have got some chance of adding features and/or fixing bugs...
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
i have a love/hate relationship with ANTLR.
Mostly, I love its parsing algorithm, but hate its grammar and just the "feel" of the tools. in terms of the tools probably all the java. java is always such a slug.
The grammar is the big deal for me though. Ugh i hated it. Programmar (also gone) had THE best parser and grammar format. It's only downside was it didn't generate code, and it was commercial, but it was brilliant.
It inspired the grammar format I use, which frankly, I think is better than anything else currently out there, if i do say so myself. I mean - it's clean, intuitive, supports all the nice little constructs, lets you shape the parse tree with it, has attributes, and lets you declare your terminals in A/EBNF or regex. without requiring a separate section for them in the grammar (though i generally segregate them for good practice)
/****************************************************************\
* ebnf.ebnf: a self describing grammar for describing grammars *
* by codewitch honey crisis, july 2019 *
\****************************************************************/
grammar<start>= productions;
//
// productions
//
// marking a non-terminal with collapse removes it from
// the tree and propagates its children to its parent
// marking a terminal with it similarly hides it from
// the result but not from the grammar, unlike hidden
//
productions<collapsed> = production productions | production;
production= identifier [ "<" attributes ">" ] "=" expressions ";";
//
// expressions
//
expressions<collapsed>= expression { "|" expression };
expression= { symbol };
symbol= literal | regex | identifier |
"(" expressions ")" |
"[" expressions "]" |
"{" expressions ("}"|"}+");
//
// attributes
//
// recognized attributes are hidden, collapsed, terminal, start,
// followsConflict (which can be "error", "first" or "last")
// and blockEnd (string)
attributes<collapsed>= attribute { "," attribute};
attribute<color="red">= identifier [ "=" attrvalue ];
attrvalue<color="orange">= literal | integer | identifier;
//
// terminals
//
literal= '"([^"\\]|\\.)*"';
regex= '\'([^\'\\]|\\.)*\'';
identifier= '[A-Z_a-z][\-0-9A-Z_a-z]*';
integer= '\-?[0-9]+';
// hide comments and whitespace
//
// if you mark a production with the terminal attribute, you
// can use ebnf to define it. Anything that's text or regex
// is automatically a terminal
whitespace<hidden,terminal>= {" "|"\v"|"\f"|"\t"|"\r"|"\n"}+; //'[ \v\f\t\r\n]+';
// single quotes denote regex. make sure to escape single
// quotes in the regex with \'
// attributes get passed through to the parser, and you can define your own
lineComment<hidden,color="green">= '//[^\n]*[\n]';
blockComment<hidden,blockEnd="*/",color="green">= "/*";
// defining these isn't required, but gives
// us better constant names
// double quotes denote a literal. the escapes are nearly the
// same as C#. \U and \x are not supported
or="|";
lt="<";
gt=">";
eq="=";
semi=";";
comma=",";
lparen="(";
rparen=")";
lbracket="[";
rbracket="]";
lbrace="{";
rbrace="}";
rbracePlus="}+";
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
I've been using PEG (Parsing Expression Grammars) recently - it's a bit different to EBNF & more oriented towards recursive descent parsers, but is quite nice. It doesn't have some niceties (such as case insensitive matching - although I would have thought that could be added easily enough).
The particular parser generator I've been using automates whitespace processing (see %whitespace ), necessitating token indicators (expressions surrouned by < and > ), and also allows productions to be marked as ignored (with a leading ~ ). It also has an online parser checker & processor, which has been useful - apart from when I found a pathological case in the generated code for the parser's grammar...
License <- LicenseTerm (EOL LicenseTerm)* EOL*
LicenseTerm <- SecretTerm / TimeTerm / LocationTerm / IdentityTerm
SecretTerm <- SECRET EQUAL < REST_OF_LINE >
REST_OF_LINE <- ( !EOL_C . )+
LocationTerm <- ANYWHERE / NodeTerm
NodeTerm <- NODE EQUAL NO_SPACE_STRING
IdentityTerm <- ANYONE / UserTerm / DomainTerm
UserTerm <- USER EQUAL NO_SPACE_STRING
DomainTerm <- DOMAIN EQUAL NO_SPACE_STRING
TimeTerm <- PerpetualTerm / ExpiryTerm
PerpetualTerm <- PERPETUAL
ExpiryTerm <- EXPIRY EQUAL ExpiryDate
ExpiryDate <- TermLength / EndDate
TermLength <- NATURAL TermUnit
TermUnit <- DAY_UNIT / WEEK_UNIT / MONTH_UNIT / YEAR_UNIT
WEEK_UNIT <- < [Ww][Ee][Ee][Kk] [Ss]? >
MONTH_UNIT <- < [Mm][Oo][Nn][Tt][Hh] [Ss]? >
DAY_UNIT <- < [Dd][Aa][Yy] [Ss]? >
YEAR_UNIT <- < [Yy][Ee][Aa][rR] [Ss]? >
EndDate <- ISO8601 / NamedDate
ISO8601 <- < ISOYEAR DASH ISOMONTH DASH ISODAY >
ISOYEAR <- DIGIT DIGIT DIGIT DIGIT
ISOMONTH <- DIGIT DIGIT
ISODAY <- DIGIT DIGIT
NamedDate <- DAY MonthName YEAR
MonthName <- JAN / FEB / MAR / APR / MAY / JUN / JUL / AUG / SEP / OCT / NOV / DEC
YEAR <- < DIGIT DIGIT DIGIT DIGIT >
JAN <- < [Jj][Aa][Nn] ( [Uu][Aa][Rr][Yy] )? >
FEB <- < [Ff][Ee][Bb] ( [Rr][Uu][Aa][Rr][Yy] )? >
MAR <- < [Mm][Aa][Rr] ( [Cc][Hh] )? >
APR <- < [Aa][Pp][Rr] ( [Ii][Ll] )? >
MAY <- < [Mm][Aa][Yy] >
JUN <- < [Jj][Uu][Nn] ( [Ee] )? >
JUL <- < [Jj][Uu][Ll] ( [Yy] )? >
AUG <- < [Aa][Uu][Gg] ( [Uu][Ss][Tt] )? >
SEP <- < [Ss][Ee][Pp] ( [Tt][Ee][Mm][Bb][Ee][Rr] )? >
OCT <- < [Oo][Cc][Tt] ( [Oo][Bb][Ee][Rr] )? >
NOV <- < [Nn][Oo][Vv] ( [Ee][Mm][Bb][Ee][Rr] )? >
DEC <- < [Dd][Ee][Cc] ( [Ee][Mm][Bb][Ee][Rr] )? >
DAY <- < DIGIT DIGIT? >
~DASH <- < '-' >
DIGIT <- [0-9]
~EQUAL <- < '=' >
NATURAL <- < DIGIT+ >
NO_SPACE_STRING <- < (![ \t\n\r] .)+ >
~ANYONE <- < [Aa][Nn][Yy][Oo][Nn][Ee] >
~ANYWHERE <- < [Aa][Nn][Yy][Ww][Hh][Ee][Rr][Ee] >
~NODE <- < [Nn][Oo][Dd][Ee] >
~DOMAIN <- < [Dd][Oo][Mm][Aa][Ii][Nn] >
~USER <- < [Uu][Ss][Ee][Rr] >
~EXPIRY <- < [Ee][Xx][Pp][Ii][Rr][Yy] >
~PERPETUAL <- < [Pp][Ee][Rr][Pp][Ee][Tt][Uu][Aa][Ll] >
~SECRET <- < [Ss][Ee][Cc][Rr][Ee][Tt] >
%whitespace <- [ \t]*
~EOL <- < EOL_C+ >
~EOL_C <- [\n\r]
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
I'm familiar with PEG. Some of it is quite nice, but my main issue with it is it's far too easy to introduce ambiguities into the grammar, which makes it fine for parsing say, JSON or even xml or something, but maybe not javascript or something else where there's a lot of unseen ambiguity that must be accounted for (trailing else on a nested if being one example)
PEG doesn't really have grammar conflicts. For really complicated grammars, you want conflict detection.
I've considered implementing one, as it would be if nothing else, in the interest of completeness. It doesn't use the CFG model like the main major parsing algos do, so it would take some doing. I don't have good material to show me how they work (the memoization techniques they use for example)
I could make one now, but it wouldn't be efficient without that stuff.
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
i don't even know where to post this as I don't know where to begin.
i have a profound need to translate a finite state machine into a regular expression.
the methods presented to me, of which I am aware of 3, are all presented using math formalisms that are as of yet beyond me.
i've *almost* implemented a variation of the state removal method but I got caught on the loops.
if anyone has any idea what I'm talking about and knows C# or C or C++ reply and i can shoot you my email addy or something.
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
You can rent my brain, but not borrow it, when you are sober
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
do you know the magic of FA to regular expression conversion? I could probably buy you beer for the lesson or something. =)
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|
codewitch honey crisis wrote: do you know the magic of FA to regular expression conversion? Sorry, I don't have the drugs for that, now
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
I have tutorials
Ing. Petr Zemek - Projekty[^]
like that one, but i don't understand them.
When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.
|
|
|
|
|