Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit c319ca6

Browse files
committed
[[ Java DSL Parser ]] LCB output module name to be specified on the command line
Since lcb-java files are likely to be re-used, and the output is a single lcb file, it makes sense for the lcb module name to be specified on the command line
1 parent 0786f16 commit c319ca6

File tree

14 files changed

+75
-129
lines changed

14 files changed

+75
-129
lines changed

docs/specs/java-ffi-dsl.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ The Java FFI DSL is used to describe the classes and interfaces of a
33
java package, and their constructors, methods, variables and constants.
44

55
All java class definitions should have a unique representation in the
6-
DSL (indeed in many cases it will be very similar)
6+
DSL (indeed in many cases it will be very similar).
7+
8+
The extension `.lcb-java` is recommended for java class definitions
9+
using this syntax.
710

811
## DSL syntax
912
### Package definition
10-
A package consists of a declaration of the Name, a ModuleName which is
11-
used for the LiveCode Builder output module, and a collection of class
12-
and interface definitions, and use clauses.
13+
A package consists of a declaration of the Name and a collection of
14+
class and interface definitions, and use clauses.
1315

1416
Package
15-
: "foreign" "package" <Name: QualifiedName> "named" <ModuleName: STRING> SEPARATOR
17+
: "foreign" "package" <Name: QualifiedName>
1618
{ Definition SEPARATOR }
1719
"end" "package"
1820

tests/java-ffi-dsl/bind.javabindtest

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,25 @@
1515
%% along with LiveCode. If not see <http://www.gnu.org/licenses/>.
1616

1717
%TEST BindMissingImport
18-
foreign package java.test named com.livecode.wrap
18+
foreign package java.test
1919
use %{BEFORE_IMPORT}java.import.SomeClass
2020
end package
2121
%EXPECT PASS
2222
%ERROR "Unable to find imported package" AT BEFORE_IMPORT
2323
%ENDTEST
2424

2525
%TEST BindMissingImportedDefinition
26-
foreign package java.import named com.livecode.import
26+
foreign package java.import
2727
end package
28-
foreign package java.test named com.livecode.wrap
28+
foreign package java.test
2929
use %{BEFORE_IMPORTED_DEFINITION}java.import.SomeClass
3030
end package
3131
%EXPECT PASS
3232
%ERROR "Unable to find imported definition" AT BEFORE_IMPORTED_DEFINITION
3333
%ENDTEST
3434

3535
%TEST BindIdentifierPreviouslyDeclared
36-
foreign package java.test named com.livecode.wrap
36+
foreign package java.test
3737
class A
3838
end class
3939

@@ -45,7 +45,7 @@ end package
4545
%ENDTEST
4646

4747
%TEST BindIdentifierNotDeclared
48-
foreign package java.test named com.livecode.wrap
48+
foreign package java.test
4949
class A %{BEFORE_INHERITS}inherits B
5050
end class
5151
end package
@@ -54,7 +54,7 @@ end package
5454
%ENDTEST
5555

5656
%TEST BindConstructorPreviouslyDeclared
57-
foreign package java.test named com.livecode.wrap
57+
foreign package java.test
5858
class A
5959
constructor A()
6060
constructor %{BEFORE_CONSTRUCTOR_ID}A(param as String)
@@ -65,7 +65,7 @@ end package
6565
%ENDTEST
6666

6767
%TEST BindConstructorPreviouslyDeclaredAlias
68-
foreign package java.test named com.livecode.wrap
68+
foreign package java.test
6969
class A
7070
constructor A()
7171
constructor A(param as String) named AVariant

tests/java-ffi-dsl/check.javabindtest

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
%% along with LiveCode. If not see <http://www.gnu.org/licenses/>.
1616

1717
%TEST CheckClassInheritsClass
18-
foreign package java.import named com.livecode.import
18+
foreign package java.import
1919
interface A
2020
end interface
2121
end package
22-
foreign package java.test named com.livecode.wrap
22+
foreign package java.test
2323
use java.import.A
2424
%{BEFORE_INHERITING_CLASS}class B inherits A
2525
end class
@@ -29,11 +29,11 @@ end package
2929
%ENDTEST
3030

3131
%TEST CheckClassImplementsInterface
32-
foreign package java.import named com.livecode.import
32+
foreign package java.import
3333
class A
3434
end class
3535
end package
36-
foreign package java.test named com.livecode.wrap
36+
foreign package java.test
3737
use java.import.A
3838
%{BEFORE_IMPLEMENTING_CLASS}class B implements A
3939
end class
@@ -43,11 +43,11 @@ end package
4343
%ENDTEST
4444

4545
%TEST CheckInterfaceInheritsInterface
46-
foreign package java.import named com.livecode.import
46+
foreign package java.import
4747
class A
4848
end class
4949
end package
50-
foreign package java.test named com.livecode.wrap
50+
foreign package java.test
5151
use java.import.A
5252
%{BEFORE_INHERITING_INTERFACE}interface B inherits A
5353
end interface
@@ -57,7 +57,7 @@ end package
5757
%ENDTEST
5858

5959
%TEST CheckMatchingTemplateArguments
60-
foreign package java.test named com.livecode.wrap
60+
foreign package java.test
6161
class A<T,U,V>
6262
end class
6363
class X

tests/java-ffi-dsl/grammar.javabindtest

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,23 @@
1515
%% along with LiveCode. If not see <http://www.gnu.org/licenses/>.
1616

1717
%TEST ParseTrivialPackage
18-
foreign package java.test named com.livecode.wrap
18+
foreign package java.test
1919
end package
2020
%EXPECT PASS
2121
%SUCCESS
2222
%ENDTEST
2323

24-
%TEST ParseMissingPackageAlias
25-
foreign package java.test
26-
%{EXPECT_ALIAS}end package
27-
%EXPECT PASS
28-
%ERROR "Parsing error" AT EXPECT_ALIAS
29-
%ENDTEST
30-
3124
%TEST ParseMultiplePackages
32-
foreign package java.test named com.livecode.wrap
25+
foreign package java.test
3326
end package
34-
foreign package java.test2 named com.livecode.wrap2
27+
foreign package java.test2
3528
end package
3629
%EXPECT PASS
3730
%SUCCESS
3831
%ENDTEST
3932

4033
%TEST ParseNontrivialPackages
41-
foreign package java.b named com.livecode.wrapped.java.b
34+
foreign package java.b
4235

4336
use java.a.MyClass
4437
use java.a.MyInterface
@@ -93,7 +86,7 @@ end class
9386

9487
end package
9588

96-
foreign package java.a named com.livecode.wrapped.java.a
89+
foreign package java.a
9790

9891
class SomeException
9992
end class

toolchain/java-dsl-parse.1.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ abstract form, and outputs as specified.
1818
loading _LCBFILE_ using **lc-compile** allows the functionality
1919
described by the _DSLFILE_ to be used by LCB modules.
2020

21+
* --modulename _NAME_:
22+
Use _NAME_ as the name of the LiveCode Builder module specified by the
23+
--output option.
24+
2125
* --check _CHECKFILE_:
2226
Output the parsed data to _CHECKFILE_. This is used for checking
2327
consistency of output - the result of running **java-dsl-parse** on
2428
_CHECKFILE_ should be identical to _CHECKFILE_.
25-
29+
2630
* -h, --help: Print some basic usage information.
2731

2832
* --: Stop processing options. This is useful in case _DSLFILE_ begins with `-`

toolchain/java-dsl-parse/src/bind.g

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
-- the defining id.
3131
'action' Bind(PACKAGE, PACKAGELIST)
3232

33-
'rule' Bind(Package:package(Position, Name, Alias, Definitions), ImportedPackages):
34-
DefinePackageId(Name, Alias)
33+
'rule' Bind(Package:package(Position, Name, Definitions), ImportedPackages):
34+
DefinePackageId(Name)
3535

3636
-- Make sure all the imported modules are bound
3737
BindImports(Definitions, ImportedPackages)
@@ -72,11 +72,10 @@
7272
(|
7373
FindPackageInList(Name, Imports -> Package)
7474
Package'Name -> PackageId
75-
Package'Alias -> PackageAlias
7675
(|
7776
QueryId(PackageId -> package(Info))
7877
||
79-
DefinePackageId(PackageId, PackageAlias)
78+
DefinePackageId(PackageId)
8079
Bind(Package, Imports)
8180
|)
8281
||
@@ -616,13 +615,12 @@
616615
617616
--------------------------------------------------------------------------------
618617
619-
'action' DefinePackageId(ID, ID)
618+
'action' DefinePackageId(ID)
620619
621-
'rule' DefinePackageId(Id, Alias):
620+
'rule' DefinePackageId(Id):
622621
Info::PACKAGEINFO
623622
Info'Index <- -1
624623
Info'Generator <- -1
625-
Info'Alias <- Alias
626624
Id'Meaning <- package(Info)
627625

628626
'action' DefineSymbolId(ID, MODIFIER, ID, SYMBOLKIND, TYPE)
@@ -641,7 +639,7 @@
641639
642640
'sweep' DumpBindings(ANY)
643641
644-
'rule' DumpBindings(PACKAGE'package(_, Name, _, Definitions)):
642+
'rule' DumpBindings(PACKAGE'package(_, Name, Definitions)):
645643
DumpId("package", Name)
646644
DumpBindings(Definitions)
647645

toolchain/java-dsl-parse/src/generate.g

Lines changed: 3 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333

3434
'rule' GeneratePackages(List):
3535
OutputLCBBegin()
36-
OutputWrite("module com.livecode.wrapped.java \n\n")
36+
GetOutputLCBModuleName(-> ModuleName)
37+
OutputWriteS("module ", ModuleName, " \n\n")
3738
OutputWrite("use com.livecode.java\n")
3839
GeneratingPackageIndex <- 1
3940
GenerateForEachPackage(List)
@@ -53,89 +54,13 @@
5354

5455
'action' GenerateSinglePackage(PACKAGE)
5556

56-
'rule' GenerateSinglePackage(Package:package(_, _, WrappedId, Definitions)):
57-
ModuleDependencyList <- nil
58-
ResolveIdName(WrappedId -> Name)
59-
OutputWriteI("/* module ", Name, " */\n\n")
60-
OutputWrite("/* use com.livecode.java */\n")
61-
CollectImports(Definitions)
62-
ModuleDependencyList -> List
63-
OutputImports(List)
64-
OutputWrite("\n")
57+
'rule' GenerateSinglePackage(Package:package(_, _, Definitions)):
6558
GenerateForeignHandlers(Definitions)
6659
OutputWrite("\n")
6760
GenerateDefinitions(Definitions)
68-
OutputWrite("/* end module */\n\n")
6961

7062
----------
7163

72-
'condition' IsNameInList(NAME, NAMELIST)
73-
'rule' IsNameInList(Id, namelist(Head, Tail)):
74-
IsNameEqualToName(Id, Head)
75-
'rule' IsNameInList(Id, namelist(Head, Tail)):
76-
IsNameInList(Id, Tail)
77-
78-
'action' AddModuleToDependencyList(NAME)
79-
80-
'rule' AddModuleToDependencyList(Name):
81-
ModuleDependencyList -> List
82-
IsNameInList(Name, List)
83-
84-
'rule' AddModuleToDependencyList(Name):
85-
ModuleDependencyList -> List
86-
ModuleDependencyList <- namelist(Name, List)
87-
88-
'action' CollectImports(DEFINITION)
89-
90-
'rule' CollectImports(nil):
91-
-- done
92-
93-
'rule' CollectImports(sequence(Head, Tail)):
94-
CollectImport(Head)
95-
CollectImports(Tail)
96-
97-
'action' CollectImport(DEFINITION)
98-
99-
'rule' CollectImport(use(_, Id))
100-
QueryId(Id -> Meaning)
101-
QuerySymbolId(Id -> Info)
102-
Info'Type -> Type
103-
104-
Info'Parent -> PackageId
105-
106-
QueryPackageId(PackageId -> PackageInfo)
107-
PackageInfo'Alias -> Alias
108-
ResolveIdName(Alias -> Name)
109-
110-
AddModuleToDependencyList(Name)
111-
112-
-- Fetch the info about the symbol.
113-
QuerySymbolId(Id -> SymbolInfo)
114-
SymbolInfo'Kind -> SymbolKind
115-
SymbolInfo'Type -> SymbolType
116-
117-
GeneratingPackageIndex -> Generator
118-
SymbolInfo'Generator <- Generator
119-
120-
'rule' CollectImport(Id):
121-
-- If we get here then either the id isn't imported, or we have previously
122-
-- generated it.
123-
124-
'action' OutputImports(NAMELIST)
125-
126-
'rule' OutputImports(nil):
127-
-- done
128-
129-
'rule' OutputImports(namelist(Head, Tail)):
130-
OutputImport(Head)
131-
OutputImports(Tail)
132-
133-
'action' OutputImport(NAME)
134-
135-
'rule' OutputImport(Name):
136-
OutputWriteI("/* use ", Name, " */\n")
137-
----
138-
13964
'action' GenerateForeignHandlers(DEFINITION)
14065

14166
'rule' GenerateForeignHandlers(sequence(Head, Tail)):

toolchain/java-dsl-parse/src/grammar.g

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,16 @@
9393

9494
'nonterm' Package(-> PACKAGE)
9595

96-
'rule' Package(-> package(Position, Name, Alias, Definitions)):
96+
'rule' Package(-> package(Position, Name, Definitions)):
9797
OptionalSeparator
98-
"foreign" "package" @(-> Position) PackageId(-> Name) QualifiedAliasClause(-> Alias) Separator
98+
"foreign" "package" @(-> Position) PackageId(-> Name) Separator
9999
Definitions(-> Definitions)
100100
"end" "package" OptionalSeparator
101101
END_OF_UNIT
102102

103-
'rule' Package(-> package(Position, Name, Alias, Definitions)):
103+
'rule' Package(-> package(Position, Name, Definitions)):
104104
OptionalSeparator
105-
"foreign" "package" @(-> Position) PackageId(-> Name) QualifiedAliasClause(-> Alias) Separator
105+
"foreign" "package" @(-> Position) PackageId(-> Name) Separator
106106
Definitions(-> Definitions)
107107
"end" "package" OptionalSeparator
108108

toolchain/java-dsl-parse/src/main.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,14 @@ static void
3636
usage(int status)
3737
{
3838
fprintf(stderr,
39-
"Usage: java-dsl-parse [OPTION ...] --check OUTFILE --output OUTFILE [--] SOURCEFILE\n"
39+
"Usage: java-dsl-parse [OPTION ...] --check OUTFILE --output OUTFILE [--] SOURCEFILES\n"
4040
"\n"
4141
"Parse a Java FFI DSL source file.\n"
4242
"\n"
4343
"Options:\n"
4444
" --check OUTFILE Filename for reconstructed output.\n"
4545
" --output OUTFILE Filename for generated LCB output.\n"
46+
" --modulename NAME Name for output LCB module.\n"
4647
" -Werror Turn all warnings into errors.\n"
4748
" -v, --verbose Output extra debugging information.\n"
4849
" -h, --help Print this message.\n"
@@ -77,6 +78,11 @@ static void full_main(int argc, char *argv[])
7778
SetOutputLCBFile(argv[++argi]);
7879
continue;
7980
}
81+
if (0 == strcmp(opt, "--modulename") && optarg)
82+
{
83+
SetOutputLCBModuleName(argv[++argi]);
84+
continue;
85+
}
8086
/* FIXME This should be expanded to support "-W error",
8187
* "--warn error", "--warn=error", etc. Also options for
8288
* enabling/disabling/errorifying particular warning

0 commit comments

Comments
 (0)