World: r3wp
[Parse] Discussion of PARSE dialect
older newer | first last |
Anton 31-Jul-2010 [5085] | Steeve, do you mean to say that it's impossible to get the last block without loading the complete file? |
Pekr 31-Jul-2010 [5086x2] | what about using something like open/seek at port ((size? file) - chunk-size) chunk-size? |
http://www.rebol.com/article/0199.html | |
Anton 31-Jul-2010 [5088] | Getting chunks in reverse, from the end of the file towards the start, is not hard. It's the parse rule to go with it that's difficult. But first I want to figure out the parse rule that goes forward. |
rjshanley 4-Aug-2010 [5089] | I'm using REBOL to control a test by using the Parse dialect to check information returned from the test environment. From other looking around, it seems that the best approach would be to implement a Telnet scheme to handle the input/response give and take with the test environment, but I can't find an implementation I've been able to tweak. So.....my question is, has anyone had success with loading a Telnet client as a dll/shared library and getting Telnet functionality that way? |
BrianH 4-Aug-2010 [5090x2] | Check rebol.org - I recall the existence of a telnet scheme. But isn't telnet mostly just unadorned TCP? |
http://www.rebol.org/view-script.r?script=telnet-client.r | |
rjshanley 4-Aug-2010 [5092] | Thanks for the recommendation. |
BrianH 4-Aug-2010 [5093] | Apparently the actual scheme is here (bad form on the script submission): http://www.reboltech.com/library/scripts/telnet.r |
Henrik 4-Aug-2010 [5094] | I've used Frank Sievertsens telnet.r script from rebol.org. It works well for my needs. |
BrianH 4-Aug-2010 [5095x2] | Not anymore, as it references a script from a site that doesn't exist anymore. |
Never mind, it is here: http://www.rebol.org/view-script.r?script=telnet.r | |
Henrik 4-Aug-2010 [5097] | I've got it locally, if rebol.org fails. |
rjshanley 4-Aug-2010 [5098] | Thanks all, I'll give those another shot. |
BrianH 4-Aug-2010 [5099] | And come back here if you need help with the parsing part :) |
rjshanley 4-Aug-2010 [5100] | What would have been the correct place to post? |
BrianH 4-Aug-2010 [5101] | Networking |
rjshanley 4-Aug-2010 [5102] | Thanks. I posted here because it was a Tcl/Expect-like capability someone might have implemented already. |
BrianH 4-Aug-2010 [5103] | It's OK. We all use the "I'm New" group on occasion, even when we have been here for years :) Group purism is for redirecting flame wars. |
Gregg 4-Aug-2010 [5104] | I think Expect in REBOL would be very cool. We could call it Rexpect ('ree-speckt). :-) |
Maxim 4-Aug-2010 [5105] | sort of like an assert mixed in with a default ? |
BrianH 4-Aug-2010 [5106x2] | Expect is a TCL thing which handles interaction with external programs through their human-oriented UIs. |
There's even versions of expect that handle GUIs, but that is likely out of scope here. Character UIs would be sufficient. It's sor of like screen scraping for mainframe interaction. | |
Anton 11-Aug-2010 [5108] | By the way, I got that chunky-load-first-block parse working the other day. |
RobertS 20-Aug-2010 [5109] | Why would the R3 error with parse "a b c" ["a" "b" "c"] as compared to 2.7.7 not be a severe bug in CodeCure ? |
Henrik 20-Aug-2010 [5110] | because the R3 behavior is correct. you are not parsing spaces in the above example. |
Gregg 20-Aug-2010 [5111] | Should the docs say that a block! rule implies /all? |
JoshF 1-Sep-2010 [5112] | Hi! Quick question about parsing REBOL code itself... I'm putting together an entry for a contest which is line-constrained (no more than 250 SLOC), so I want to crush my code down as much as possible while still having something that actually looks like code (I know about using the compression, but I want something that looks like a program). I'm starting with Carl's REBOL parser from the cookbook, but it seems to skip the colons for initializers ("x: x + 1" -> [x x + 1]). Here's my current hack of his parser: tokens: copy [] parse read %contest-entry.r blk-rule: [ some [ str: newline | #";" [thru newline | to end] new: (probe copy/part str new) | [#"[" | #"("] (append tokens str/1) blk-rule | [#"]" | #")"] (append tokens str/1) break | skip (set [value new] load/next str append tokens :value) :new ] ] Any ideas why it might be skipping the vital ":" character? Thanks very much! |
Anton 1-Sep-2010 [5113] | What version of Rebol are you using? Seems to work ok for me in R2. What's the input which fails? |
Gregg 1-Sep-2010 [5114] | Works for me too. |
JoshF 1-Sep-2010 [5115] | Hi! Thanks for taking a look at the code. I went over it again, it seems that part of the problem was in the fact that the parsed objects weren't transliterated into strings as I had expected. I.e. if you look at the output of the code snippet above, it seems OK, but examination of the types of the data in the tokens array turn up things that don't convert to strings too well without help. I've puzzled over Carl's pretty printer, and I _think_ I understand why now... Either way, I was able to modify it to give me the kind of output I wanted. To repay you for your kind attention, I will post my code here, but in crushed form, so it doesn't take up too much space... ; - ) REBOL [ Title: "REBOL Compressor" ] emit-space: func [ pos ] [ append out pick [ #" " "" ] found? not any [ find "[(" last out find ")]" first pos ] ] emit: func [ from to ] [ emit-space from word: copy/part from to long: ( length? out ) + length? word if 80 < long [ append lines out out: copy "" ] append out copy/part from to ] lines: copy [ ] clean-script: func [ Returns new script text with standard spacing. script "Original Script text" /local str new ] [ out: append clear copy script newline parse script blk-rule: [ some [ str: some [ newline ] ( ) | #";" [ thru newline | to end ] new: ( ) | [ #"[" | #"(" ] ( emit str 1 ) blk-rule | [ #"]" | #")" ] ( emit str 1 ) break | skip ( set [ value new ] load/next str emit str new ) :new ] ] append lines out remove lines/1 print [ length? lines "lines." ] lines ] write/lines %crushed.r clean-script read %c.r print read %crushed.r Thanks! |
Gregg 2-Sep-2010 [5116] | If you note that load/next is used when values are parsed, you can see why values aren't strings. MOLD can be your friend as FORM (and PRINT) will hide datatype details from you. e.g. >> print first [x] x >> print first [x:] x >> print first ['x] x >> print first [:x] x |
Maxim 2-Sep-2010 [5117] | which is why its a good habit to use use probe instead of print in most cases where you trace data |
Anton 2-Sep-2010 [5118] | JoshF, if this script stands alone then I would make these changes: - Add as locals to EMIT: WORD and LONG. - Add to CLEAN-SCRIPT's locals: LINES, OUT, EMIT-SPACE, EMIT, BLK-RULE, VALUE - Move into CLEAN-SCRIPT's body: 1 lines: copy [] 2 The EMIT-SPACE function 3 The EMIT function - Change this line: out: append clear copy script newline to: out: copy "" (There's no point copying the string SCRIPT when the next thing you do is CLEAR it.) - Remove this line: remove lines/1 (There seems no point in initializing OUT with a single newline char if it is only to be removed ultimately.) After, that, you should have only one word, CLEAN-SCRIPT, defined globally, referring to a function with no side-effects. |
Fork 5-Sep-2010 [5119] | I couldn't figure out how to make DO work in Parse. My answer here shows an example that I tried: http://stackoverflow.com/questions/3478589/rebol-parse-problem |
BrianH 5-Sep-2010 [5120x3] | R3's PARSE DO operation only works with block parsing, not string parsing. |
>> parse [2] [do (1 + 1)] == true | |
Given your example, you wouldn't want to use DO anyhow since you would be creating a charset in a loop, creating a new charset for each iteration. It is better to create it once ahead of time. | |
Fork 5-Sep-2010 [5123x2] | Hrrrm. I haven't messed with block parsing much, but it breaks any obvious intuition that >> parse [[2]] [do [(1 + 1)]] is true and >> parse [2] [do [(1 + 1)]] is also true. :-{ |
Is there a foundational reason for DO not being available for string parsing, or is it just not implemented? | |
Micha 5-Sep-2010 [5125] | how to set local vars in parse ? rule: [ "text" (var: "local") ] var: "global" f: func [ /local var ] [parse "test" rule return var ] f ; result = none not "local" what to do get result = "local" |
Nicolas 5-Sep-2010 [5126] | ;Does this help? rule: [ "text" (var: "local") ] var: "global" f: func [ /local var ] [var: "local" parse "test" rule return var ] f |
Graham 5-Sep-2010 [5127x2] | f: has [ var rule ][ var: none rule: [ "text" end (var: copy "local" ) ] parse/all [ "text" ] rule var ] |
you're using a block parse rule to parse a string .. so we switched to using a data block to parse | |
Nicolas 5-Sep-2010 [5129] | ;This also works var: "global" f: has [var] [ rule: [ "test" (var: "local") ] parse "test" rule var ] f |
Steeve 5-Sep-2010 [5130x2] | Actually, DO is really easy to simulate, both in R2 and R3. Just construct the rule on the fly. >> parse [2][(rule: do [1 + 1]) 1 1 rule] ==true |
Remember, all new commands in R3 can be emulated in R2. | |
Micha 5-Sep-2010 [5132] | and what if rule ic create dynamic form file in global words and can not by create in functions ? |
Steeve 5-Sep-2010 [5133] | sorry ? |
Anton 5-Sep-2010 [5134] | I think he meant to ask "and what if RULE is created dynamically (ie. loaded from a file) and thus its words are global, and are not (or cannot be) created by functions?" |
older newer | first last |